繁体   English   中英

如何在 linq 中创建动态 lamda 表达式

[英]How to create dynamic lamda expression in linq

我想通过添加 where 子句来过滤列表取决于 where 子句中所需的属性是否不是输入参数中的 null 然后仅将其添加到 where 子句中,否则不要添加它。 如果两者都不是 null 则使用这两个属性进行过滤。 在下面的示例中,有三个 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;
    }
}

任何提示都会有所帮助。

不要使用.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();

但是,不确定这是否是您真正想要的

if (employee.Property1 != null || employee.Property2 != null)
    filteredEmployee = employees.FirstOrDefault(r => 
            (employee.Property1 == null || r.Property1 == employee.Property1) &&
            (employee.Property2 == null || r.Property2 == employee.Property2))

像这样? 请注意,employee.Property1 和employee.Property2 均为 null 的情况不予处理。

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
        filteredEmployee = employees.FirstOrDefault(r => 
           (employee.Property1 == null || r.Property1 == employee.Property1) && 
           (employee.Property2 == null || r.Property2 == employee.Property1));

        return filteredEmployee;
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM