c# - Entity Framework 过滤器 "Expression<Func<T, bool>>"

标签 c# entity-framework lambda

我正在尝试为 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/

相关文章:

c# - 在可变长度字符串的末尾添加固定数量的空格

c# - Entity Framework 6.1 和使用新关键字隐藏成员

c# - 为什么这段代码返回109?

java - 使用 Lambda Map 函数而不是迭代来填充 Map

c# - 在多对多关系中包含很多对象

c# - Specflow 特征文件 - 可能有多行示例

c# - 编辑时未选择 MVC 级联下拉列表

c# - 如何将类(class)添加到列表中?

c# - 如何搜索导航属性的属性

java - 如何从方法引用创建比较器?