[英]Dynamic expression: How compiler compiles and what lamda expression to expect
[英]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.