C# C Lambda-其中-相同条件的多个表达式

C# C Lambda-其中-相同条件的多个表达式,c#,lambda,expression,C#,Lambda,Expression,假设-一个聚会商店希望根据他们的DB中的标准选择人 DB名称生日字段:日、月、年 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

假设-一个聚会商店希望根据他们的DB中的标准选择人

DB名称生日字段:日、月、年

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中使用| |或条件:


注意:这并不适用于您列出的所有场景。只需在上附加更多条件,并小心使用括号将它们正确分开。

为什么不将日期加载到HashSet中呢


或者我遗漏了什么?

如果您需要动态地构建它,使用几个扩展方法就很容易了。例如:

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
  );
}

你是在找一个简单的| | |还是在这里?或者我没有抓住要点?你可以使用三个列表来存储日、月和年,然后在where条件下使用Contains。如果你认为我的理解是正确的,我会发布一个答案!对不起,你能澄清一下吗that@JayMee-是的,因为它是动态的。不会每次都是一样的。在一次搜索中,它是1,但另一个人搜索的是它的3。每个用户都有不同的search@AnswerIsNot42,这是动态构建Where子句的一种很好的方法。我喜欢这样,它很简洁,并且可以像我建议的那样避免Where的膨胀+1.不是我想要的,而是创意!!!我喜欢它,但老实说,我甚至不想以那种方式对这种逻辑说不。这仍然是一个很酷的概念,我会登录到你的大脑。。。。考虑一下,如果我只需要ID,那么它将是ID、天、月、年…但是还是很好的视角不,那么1不起作用。。。它只是一个实例而不是2。没有或| | |,但无论如何它只能是一个实例?如果o.Day==12,那么o.Day==3是不可能的。第二部分是宾果游戏,这就是我要找的……第一部分我不明白:……这就是我想弄明白的:【编辑-拼写】@AnswerIsNot42什么部分给你带来麻烦?第一个函数只是返回一个类型化的假表达式——基本上,这对于易于键入很重要。secondn函数有点复杂,但归根结底是接受一个表达式,或者使用另一个表达式。棘手的部分是调用lambda,而我通常会将其打开——在可查询项中更容易处理;但这有点干净。有更简单的方法来构建复合表达式,但这是最简单的方法来组合单个表达式或将单个表达式组合在一起explanation@Luaan我有点理解,但我对这一点的想法充其量也就是失去。你说那更干净,好吧,但你能让它更脏/更简单吗?@Luaan page刚刚刷新,我会看看那个链接
   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);