gpt4 book ai didi

c# - Entity Framework 结合来自不同实体的 lambda 表达式

转载 作者:行者123 更新时间:2023-11-30 18:17:23 25 4
gpt4 key购买 nike

我有 2 个几乎相同的 lambda 表达式。一个返回 Expression<Func<Person, bool>>另一个返回 Expression<Func<Admission, bool>> .

这两个实体之间存在直接关系。 Person可以有很多 Admissions .

这两个表达式看起来像这样:

人物表达:

public static Expression<Func<Person, bool>> SearchPerson(string searchTerm)
{
if(string.IsNullOrEmpty(searchTerm))
{
return p => true;
}

return p => p.Nhino.Contains(searchTerm) ||
p.Firstname.Contains(searchTerm) ||
p.Lastname.Contains(searchTerm) ||
p.Pfname.Contains(searchTerm);
}

Admission 表达式:

public static Expression<Func<Admission, bool>> SearchPerson(string searchTerm)
{
if(string.IsNullOrEmpty(searchTerm))
{
return a => true;
}

return a => a.Person.Nhino.Contains(searchTerm) ||
a.Person.Firstname.Contains(searchTerm) ||
a.Person.Lastname.Contains(searchTerm) ||
a.Person.Pfname.Contains(searchTerm);
}

这些搜索表达式在整个系统中广泛使用。

请注意 return语句实际上是相同的,如果我们的客户想向列表中添加更多搜索条件,我希望将此逻辑放在一个地方,而不必为 Admission 更新它和 Person表达式。

有没有一种方法可以创建一个可以同时用于 People.Where() 的表达式或类似表达式?子句和 Admissions.Where()子句(或什至其他想要按相同 Person 条件搜索的父/子关系)而不重复代码?

最佳答案

只要您可以控制这些类的设计,就可以实现带有谓词函数的接口(interface)。

例如:

public interface ITestable
{
Func<string, bool> Predicate { get; }
}

public class Admission : ITestable
{
// ...other members...

public Person Person { get; }

public Expression<Func<string, bool>> Predicate =>
x => Person.Predicate(x);
}

public class Person : ITestable
{
// ...other members...

public Expression<Func<string, bool>> Predicate =>
x => string.IsNullOrEmpty(x) || FirstName.Contains(x) || LastName.Contains(x);
}

// The calling code:
IQueryable<ITestable> people =
source.Where(x => x.Predicate(searchTerm));

关于c# - Entity Framework 结合来自不同实体的 lambda 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43927572/

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