【问题标题】:How to call custom method in linq query如何在 linq 查询中调用自定义方法
【发布时间】:2013-07-10 21:27:39
【问题描述】:

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

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

【问题讨论】:

  • 几个提示——如果你有布尔运算,你不需要返回truefalse——只返回运算结果。我认为玩家应该有 Birth 日期。并尝试将日期存储为DateTime 而不是字符串。
  • 我将日期存储为字符串,因为 sqlsever 不支持 PresianDateTime,我需要将 PresianDateTime 转换为公历进行比较。我想我应该保存他们两个;我数据库中的波斯和公历日期。

标签: c# linq entity-framework


【解决方案1】:

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

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

【讨论】:

  • 此查询将从 myEntity.Players 表中选择所有记录。它可能很昂贵..
  • @YD1m:为什么你对别人的答案发表评论,而不是你自己的?
  • 克里斯,我的评论如何参考我的答案?我刚刚错过了lazyberezovsky 答案的最后一个字符串。
  • 当我添加 'AsEnumerable()' 来查询时,我得到空集合结果! (“枚举没有结果”)。为什么会这样?
  • @M.Doos 看起来 myEntity 不是上下文,并且您没有加载播放器。你从哪里得到myEntity 实例?
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-27
    • 1970-01-01
    • 2014-08-04
    • 1970-01-01
    • 2018-11-30
    • 1970-01-01
    相关资源
    最近更新 更多