【发布时间】:2023-03-16 05:05:01
【问题描述】:
在使用 EF Core 的应用程序中,我试图通过创建可重用的谓词表达式库来消除查询代码的重复。但是,我正在为接受运行时参数的谓词而苦苦挣扎。
让我们假设父子关系中有 2 个简单的实体类:
public class Parent
{
public double Salary { get; set; }
public ICollection<Child> Children { get; set; }
}
public class Child
{
public double Salary { get; set; }
}
我可以使用像这样的常规 EF Core 查询来检索所有有孩子收入高于他们的父母:
return Context.Set<Parent>()
.Where(parent => parent.Children.Any(child =>
child.Salary > parent.Salary));
如果我想为上述查询创建一个可重用的谓词,我想它可能看起来像这样:
private Expression<Func<Child, Parent, bool>> EarnsMoreThanParent = (Child child, Parent parent) => child.Salary > parent.Salary;
上述谓词编译正常,但我还没有找到任何使用它的方法。问题是如何在运行时将父实体传递给它。这不编译:
return _context.Set<Parent>()
.Where(parent => parent.Children.Any(child =>
EarnsMoreThanParent(child, parent));
我知道我将Expression<> 和Func<> 语法混为一谈,但我认为这是一个相对常见的要求,必须是可能的。
谢谢
【问题讨论】:
标签: entity-framework-core expression-trees predicatebuilder