c# - 如何在 linq 中创建动态 lamda 表达式
问题描述
我想通过添加 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;
}
}
任何提示都会有所帮助。
解决方案
而不是使用.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();
推荐阅读
- linux - Kibana 6.5 指向多个 elasticsesrch 节点
- 2sxc - 播客剧集排序顺序
- sql - Postgres 查询时间执行在两个查询之间变化很大(不呈现低结果问题)
- python - 验证函数调用其他函数太多次
- node.js - axios.put() 与 formData 反应 axios 不发送 req.params.id === undefined
- python - 高阶函数固定参数。使其固定两个参数相等
- matlab - 为什么从侦听器回调函数中调用保存命令会失败?
- html - HTML:为什么在 _blank 和另一个字符中加下划线
- php - Laravel - 共享数据减少查询次数
- python - 如何为打印语句编写python单元测试?