c# Lambda - Where -相同条件的多个表达式
本文关键字:条件 表达式 Lambda Where | 更新日期: 2023-09-27 18:14:02
假设-一方商店希望根据其数据库中的标准选择人员。
数据库名称"生日"字段:日,月,年
where需要动态地考虑搜索实例的每个考虑因素:
- 日= 12,月= 1,年= 1962
- 日= 3,月= 4,年= 1977;日= 13,月= 4,年= 1977 日= 20,月= 8,年= 1941;日= 9,月= 1,年= 1991;日= 19,月= 11,年= 1986;日= 25,月= 2,年= 1956
显然不起作用,因为它只考虑一个搜索实例,而可能有3个甚至10个:
query.Where(o => o.Day == 3 && o.Month == 4 && o.Year == 1997);
我试着看一下表达式和参数表达式,但不能把我的头围绕着它。
[注]@Luaan是目前为止最接近的一个,添加"||"不会指向#1。
我要把这个贴出来,冒着被否决的风险。但是,如果我没有错过重点,您可以在where
中使用||
(或)条件:
query.Where(o => (o.Day == 12 && o.Month ==14 && o.Year == 1962) ||
(o.Day == 3 && o.Month == 4 && o.Year == 1977));
注意:这并不能满足您所列出的所有场景。只需在上面附加更多的条件,并小心地使用括号将它们正确地分开。
为什么不将日期加载到HashSet<DateTime>
中呢?
HashSet<DateTime> birthDays = new HashSet<DateTime>() {
new DateTime(1962, 1, 12),
new DateTime(1977, 4, 3),
...
};
...
var result = query
.Where(o => birtDays.Contains(o));
还是我错过了什么? 如果您需要动态构建它,使用几个扩展方法非常容易。例如:
public static Expression<Func<T, bool>> False<T>(this IQueryable<T> @this)
=> _ => false;
public static Expression<Func<T, bool>> Or<T>
(this Expression<Func<T, bool>> left, Expression<Func<T, bool>> right)
=>
Expression.Lambda<Func<T, bool>>
(
Expression.OrElse
(
left,
Expression.Invoke
(
right,
left.Parameters.Cast<Expression>()
)
),
left.Parameters
);
}
然后你可以这样做:
var predicate = query.False();
foreach (var date in filterDates)
{
predicate =
predicate.Or(i => i.Day == date.Day && i.Month == date.Month && i.Year == date.Year);
}
query = query.Where(predicate);