>"-6ren"> >"-我正在尝试为 Entity Framework 列表创建一个过滤方法并更好地理解 Expression Filter(IEnumerable src, Expression> pred) { -6ren">
gpt4 book ai didi

c# - Entity Framework 过滤器 "Expression>"

转载 作者:可可西里 更新时间:2023-11-01 03:04:21 27 4
gpt4 key购买 nike

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com