【问题标题】:Consolidate many if conditions to a single LINQ statement using OR [duplicate]使用 OR [重复] 将多个 if 条件合并到单个 LINQ 语句
【发布时间】:2012-01-04 22:19:10
【问题描述】:

可能重复:
Linq: “Or” equivalent of Where()

大约一周前,我发布了question,其中根据我的参数中是否包含值附加到 LINQ 查询的解决方案如下所示:

var query = Database.Set<User>();

if (condition1.HasValue)
{
    query = query.Where(x => x.Condition1 == condition1.Value);
}
if (condition2.HasValue)
{
    query = query.Where(x => x.Condition2 == condition2.Value);
}
...
return query.ToList();

此代码将使用 AND 附加到 WHERE 子句。我将如何使用 OR 来附加到 WHERE 子句?

【问题讨论】:

  • 你在评论中问了我一个问题。然后我在评论中回复了它——你在问这个问题之前读过它并点击链接吗?
  • 我在发布前检查了评论,但还没有答案,所以我想我会发布一个新问题。我现在来看看。谢谢。

标签: c# linq


【解决方案1】:

您需要使用谓词构建器here is an example

【讨论】:

    【解决方案2】:

    您可以尝试使用PredicateBuilder 库。这是一个示例:

    var predicate = PredicateBuilder.False<User>();
    if (condition1.HasValue)
    {
      predicate = predicate.Or(x => x.Condition1 == condition1.Value);
    }
    if (condition2.HasValue)
    {
      predicate = predicate.Or(x => x.Condition2 == condition2.Value);
    }
    return Database.Set<User>().Where(predicate);
    

    【讨论】:

      【解决方案3】:

      这可以作为 PredicateBuilder 的替代方案。

      var query = Database.Set<User>();             
      var query2 = query.Where(x => (condition1.HasValue && x.Condition1 == condition1.Value) || (condition2.HasValue && x.Condition2 == condition2.Value));
      

      【讨论】:

        【解决方案4】:

        为此,您必须自己创建表达式树。或者另一种方式,您可以使用动态 LINQ 并构造 LINQ 查询字符串并执行它。 查看 System.Linq.Expression 名称,或 System.Linq.Dynamic

        【讨论】:

          【解决方案5】:

          你不能。说明:

          var iS = {1,2,3,4,5};
          var iEvens = iS.Where(x => x % 2 == 0);
          var iEvensAddOr = iEvens.OrWhere(x => x % 2 == 1);
          

          您希望拥有iS.Where(x =&gt; x % 2 == 0 || x % 2 == 1),但您已经使用第一个Where() 过滤了您的列表。您想要的是撤消过滤器并创建一个新过滤器。但是你已经过滤了,来不及了。

          你可以使用联合,但这并不是你想要的。

          【讨论】:

            猜你喜欢
            • 2011-12-30
            • 1970-01-01
            • 2019-03-01
            • 1970-01-01
            • 2014-08-13
            • 1970-01-01
            • 2012-09-02
            • 1970-01-01
            • 2017-01-27
            相关资源
            最近更新 更多