4

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

 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 查询中调用这个方法?

4

2 回答 2

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 
              };

请记住,这将通过网络将所有玩家数据传输到本地计算机。

于 2013-07-08T08:22:09.477 回答
0

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

于 2013-07-10T09:54:42.877 回答