簡體   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