我正在尝试为 Entity Framework 列表创建一个过滤方法并更好地理解
Expression<Func<...
我有一个这样的测试函数。
public IQueryable<T> Filter<T>(IEnumerable<T> src, Expression<Func<T, bool>> pred)
{
return src.AsQueryable().Where(pred);
}
如果我这样做:
context.Table.Filter(e => e.ID < 500);
或者这个:
context.Table.Filter(e => e.SubTable.Where(et => et.ID < 500).Count() > 0 && e.ID < 500);
一切正常。
但是如果我这样做:
context.Table.Filter(e => e.SubTable.Filter(et => et.ID < 500).Count() > 0 && e.ID < 500);
或者这个:
context.Table.Where(e => e.SubTable.Filter(et => et.ID < 500).Count() > 0 && e.ID < 500);
我收到一个错误。
LINQ to Entities does not recognise the method ...Filter...
为什么它在一种情况下有效而在另一种情况下无效?我应该在过滤器中更改什么以使其与相关表一起使用? 我更愿意远离其他外部库,因为我想要了解它是如何工作的,并能够在未来的任何场景中使用它。
在前两种情况下,过滤器在数据库中正确运行。
最佳答案
Jon 和 Tim 已经解释了为什么它不起作用。
假设 Filter
中的过滤器代码不是微不足道的,您可以更改 Filter
以便它返回一个 EF 可以翻译的表达式。
假设您有以下代码:
context.Table.Where(x => x.Name.Length > 500);
您现在可以创建一个返回此表达式的方法:
Expression<Func<YourEntity, bool>> FilterByNameLength(int length)
{
return x => x.Name.Length > length;
}
用法是这样的:
context.Table.Where(FilterByNameLength(500));
您在 FilterByNameLength
中构建的表达式可以是任意复杂的,只要您可以将它直接传递给 Where
。
关于c# - Entity Framework 过滤器 "Expression<Func<T, bool>>",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18337692/