具有表达式函数的谓词出错
本文关键字:谓词 出错 函数 表达式 | 更新日期: 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
枚举,从而将我们的对象拉入内存。