【问题标题】:Error in a predicate with expression function带有表达式函数的谓词中的错误
【发布时间】:2015-05-08 16:15:05
【问题描述】:

我在 LINQ Where 方法(返回 IQueryable 结果)中为谓词使用表达式函数,该方法采用类参数:

    public ActionResult FilterProfiles(FilterViewModel filter)
    {
        var profiles = database.Profiles
            .Where(Predicate(filter))
            ...
    }

谓词是:

    private static Expression<Func<UserProfile, bool>> Predicate(FilterViewModel f)
    {
       return p => (CompareFilter(p, f));
    }

问题出在 CompareFilter 函数上:

    private static bool CompareFilter(UserProfile profile, FilterViewModel filter)
    {
        if (filter.FirstName != null)
        {
            if (profile.FirstName != null)
            {
                if (profile.FirstName.CompareTo(filter.FirstName) != 0)
                {
                    return false;
                }
            }
       ...
      }

例外是:

LINQ to Entities 无法识别方法 'Boolean CompareFilter(Project.Models.UserProfile, Project.Web.ViewModels.FilterViewModel)' 方法,并且该方法无法转换为存储表达式。

异常详细信息:System.NotSupportedException:LINQ to Entities 无法识别方法 'Boolean CompareFilter(Project.Models.UserProfile, Project.Web.ViewModels.FilterViewModel)' 方法,并且此方法无法转换为存储表达式。

提前致谢!

【问题讨论】:

    标签: c# linq entity-framework predicate


    【解决方案1】:

    问题是您试图在 Lambda 中使用由实体框架翻译的方法。

    Entity Framework 实际上是使用IQueryables 在您调用它们时将您的方法调用转换为 SQL,以便无缝查询数据库。然而,这意味着 定义的任何方法本质上都在实体框架的范围之外,因此它无法将其转换为 SQL,从而失败。即使您知道来源,Expression 函数也无法将编译的方法作为表达式树访问。

    对此(以及许多其他类似情况)的解决方法是使用.AsEnumerable(),这将导致进一步的Linq 调用成为IEnumerable 版本,它通过foreach 进行枚举,从而将我们的对象拉入内存。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-06-20
      • 1970-01-01
      • 2021-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多