如何在linq查询中调用自定义方法

时间:2013-07-08 08:17:49

标签: c# linq entity-framework

我写了一个自定义方法,如下所示:

 DateTime GetGregorianDate(string date)
    {
       return  new DateTime(int.Parse(date.Substring(0, 4)), int.Parse(date.Substring(5,    2)), int.Parse(date.Substring(8, 2)), new System.Globalization.PersianCalendar());
    }

我希望在linq查询中调用此方法,如下所示:

 dynamic GetPlayerListByTeamName(string teamCode, FutsalEntities myEntity)
    {
        var player = (from p in myEntity.Players
                     where p.TeamCode == teamCode && (GetGregorianDate(p.ContractDateTo) <= DateTime.Now) ? true : false
                     select new { p.MeliCode, p.BearthDate, p.ContractNumber, p.InsuranceNumber, p.ContractDate, p.Mobile });
        return player;

    }

这是调用代码的地方:

  private void cmbTeams_SelectedIndexChanged(object sender, EventArgs e)
    {
        using (FutsalEntities myEntity = new FutsalEntities())
        {
            if (cmbTeams.SelectedIndex != -1 && myEntity.Players.Count() != 0)
            {
               dgPlayerList.DataSource =  GetPlayerListByTeamName(cmbTeams.SelectedValue.ToString(), myEntity);

但是当我运行应用程序时出现此错误:

LINQ to Entities无法识别方法'System.DateTime GetGregorianDate(System.String)'方法,并且此方法无法转换为商店表达式。

有没有办法在linq查询中调用此方法?

2 个答案:

答案 0 :(得分:4)

Linq to Entities无法将您的方法转换为SQL并在服务器端执行它。调用自定义方法的唯一方法是将查询移动到内存中 - 例如致电AsEnumerable()ToList()

var players = from p in myEntity.Players.AsEnumerable()                      
              where GetGregorianDate(p.ContractDateTo) <= DateTime.Now
              select new { 
                  p.Name,
                  p.BearthDate, 
                  p.ContractNumber, 
                  p.InsuranceNumber, 
                  p.ContractDate, 
                  p.Mobile 
              };

请注意,这会将所有播放器数据通过网络传输到本地计算机。

答案 1 :(得分:0)

将DateTime.Now转换为波斯日期,将其存储在变量中,然后在查询中使用该变量,以便服务器端查询进行波斯日期比较。