首页 > 解决方案 > 如何在 linq 中创建动态 lamda 表达式

问题描述

我想通过添加 where 子句来过滤列表,这取决于输入参数中 where 子句中所需的属性是否不为 null 然后仅将其添加到 where 子句中,否则不要添加它。如果两者都不为空,则使用这两个属性进行过滤。在下面的示例中,有三个 if 条件,我们可以将它们组合成一个 lamda 表达式吗?

 public class Employee
{
    public int? Property1 { get; set; }
    public int? Property2 { get; set; }

    public Employee GetEmployeeByProperty(Employee employee)
    {
        Employee filteredEmployee = new Employee();
        List<Employee> employees = new List<Employee>();
        // Logic to fill employee list

        #region Can we combine these conditions into one lamda expressoin
        if (employee.Property1 != null && employee.Property2 != null)
            filteredEmployee = employees.FirstOrDefault(r => r.Property1 == employee.Property1 && r.Property2 == employee.Property1);
        else if (employee.Property1 != null)
            filteredEmployee = employees.FirstOrDefault(r => r.Property1 == employee.Property1);
        else if (employee.Property2 != null)
            filteredEmployee = employees.FirstOrDefault(r => r.Property2 == employee.Property2); 
        #endregion

        return filteredEmployee;
    }
}

任何提示都会有所帮助。

标签: c#linqlambda

解决方案


而不是使用.FirstOrDefault(lambda),构建一个表达式,如.Where(lambda).FirstOrDefault();

        IEnumerable<Employee> employees = ...

        if (employee.Property1 != null)
            employees = employees.Where(r => r.Property1 == employee.Property1);
        if (employee.Property2 != null)
            employees = employees.Where(r => r.Property2 == employee.Property2); 

        filteredEmployee = employees.FirstOrDefault();

推荐阅读