Как создать выражение Dynami c lamda в linq - PullRequest
0 голосов
/ 08 мая 2020

Я хочу отфильтровать список, добавив предложение 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;
    }
}

Любая подсказка поможет.

Ответы [ 3 ]

1 голос
/ 11 мая 2020

Вместо использования .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();
0 голосов
/ 08 мая 2020

Как это? Обратите внимание, что случай, когда и 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;
    }
}
0 голосов
/ 08 мая 2020

Не уверен, что это именно то, что вы ищете, но

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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...