c# Lambda - Where -相同条件的多个表达式

本文关键字:条件 表达式 Lambda Where | 更新日期: 2023-09-27 18:14:02

假设-一方商店希望根据其数据库中的标准选择人员。

数据库名称"生日"字段:日,月,年

where需要动态地考虑搜索实例的每个考虑因素:

  1. 日= 12,月= 1,年= 1962
  2. 日= 3,月= 4,年= 1977;日= 13,月= 4,年= 1977
  3. 日= 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。

c# Lambda - Where -相同条件的多个表达式

我要把这个贴出来,冒着被否决的风险。但是,如果我没有错过重点,您可以在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);