我有 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);
}
录取表达:
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
条件进行搜索的父/子关系(中使用,而无需重复代码?
前提是您可以控制这些类的设计,则可以使用谓词函数实现接口。
例如:
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));