【问题标题】:How to combine Linq query results如何组合 Linq 查询结果
【发布时间】:2011-01-10 23:16:27
【问题描述】:

我需要能够将未知数量的 where 子句添加到 Linq 查询。目前我一直在尝试使用 Concat() 组合查询。例如:

var r1 =
    from field in db.fields
    where ID == 1
    select field;

var r2 = 
    from field in db.fields
    where ID == 2
    select field

var r3 = r1.Concat(r2);

这给了我奇怪的结果,所以我知道必须有更好的方法来做到这一点。有没有办法按照“累积结果”的方式做一些事情?如:

r1 = r1 + r2

其中 r1 得到它之前的所有结果加上 r2 的所有结果。这将允许我遍历“where”过滤器列表并将它们组合为 OR 语句。感谢任何可以提供帮助的人!

【问题讨论】:

    标签: linq


    【解决方案1】:

    听起来您正在寻找联合运算符:

    var r1 = Context.Fields.Where<FieldObject>(f => f.ID == 1).Select<FieldObject, Field>(f => f.Field);
    var r2 = Context.Fields.Where<FieldObject>(f => f.ID == 2).Select<FieldObject, Field>(f => f.Field);
    var r3 = r1.Union<Field>(r2);
    

    【讨论】:

      【解决方案2】:

      如果您尝试这样做 r1 = r1 + r2,那么您应该使用一些 immediate query execution 行为,例如 ToList。您会看到,在 LINQ 中,查询仅在需要时执行,而不是在定义的地方执行。 所以查询应该看起来像

      r1 = r1.Union(r2).ToList()
      

      另外,请注意使用 Union 而不是 Concat。 “Concat 方法返回输入序列中的所有原始元素。Union 方法只返回唯一元素。” (来自msdn)

      编辑:或者您可以使用 PredicateBuilder 来构建 OR-ed 谓词,类似于

      var predicate = PredicateBuilder.False<Field>();
      foreach(Expression<Func<Field,Boolean>> filt in filters){
        predicate = predicate.Or(filt);
      }
      var result = db.fields.Where(predicate);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-04-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多