[英]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.