实体框架组合来自不同实体的 lambda 表达式



我有 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语句实际上是相同的,如果我们的客户想要向列表中添加更多搜索条件,我希望将此逻辑放在一个位置,而不必针对AdmissionPerson表达式更新它。

有没有办法创建一个表达式或类似表达式,可以在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));

最新更新