具有表达式函数的谓词出错

本文关键字:谓词 出错 函数 表达式 | 更新日期: 2024-10-21 01:18:04

我在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)"方法,并且此方法无法转换为存储表达式

提前感谢!

具有表达式函数的谓词出错

问题是您试图在由Entity Framework翻译的lambda中使用一个方法。

实体框架实际上是在使用IQueryable将方法调用转换为SQL,使查询数据库变得无缝。然而,这意味着,您定义的任何方法本质上都不在实体框架的权限范围内,因此无法将其转换为SQL,从而失败。即使您知道源代码,Expression函数也无法访问作为表达式树的编译方法。

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