【问题标题】:Concat IQueryable collections in one db request在一个数据库请求中连接 IQueryable 集合
【发布时间】:2014-09-02 21:20:07
【问题描述】:

我使用实体框架。我需要连接两个集合。例如:

IQueryable<SomeType> collection1 = context.Entiies.Where(predicate);
IQueryable<SomeType> collection2 = context.Entiies.Where(otherPredicate);

var result = collection1.concat(collection2).toList(); //1
var result = collection1.union(collection2).toList; //2

1 和 2 变体都会在数据库中执行 2 请求,因为这些方法需要 IEnumerable 作为参数。所以,问题是我可以用一个数据库调用连接两个 Iqueryble 集合

【问题讨论】:

  • 为什么不在同一个查询中使用两个谓词?
  • @Selman22,这只是一个例子,简单的问题
  • 您是否验证有多个数据库请求或只是假设将基于扩展方法签名?

标签: c# .net entity-framework linq-to-entities


【解决方案1】:

除了IEnumerable&lt;T&gt; 之外,还有IQueryable&lt;T&gt;Concat()Union() 扩展方法。您可以在可查询对象上使用它们。 Union() 映射到 SQL UNION 操作,Concat() 映射到 UNION ALL

只要您不将IQueryable&lt;T&gt; 对象转换为IEnumerable&lt;T&gt;(显式或隐式),那么您可以只使用这些方法,如果可能,它们将在数据库中进行评估。

进一步阅读:


在浏览文档时,我忽略了在Queryable 上声明的扩展方法接受IQueryable&lt;T&gt; 作为第一个参数,但IEnumerable&lt;T&gt; 作为第二个参数的细节。正如 D Stanley 指出的那样,这些方法将测试参数是否为 IQueryable&lt;T&gt;,如果是,则尝试使用相关查询引擎解析操作。

【讨论】:

  • @cosset 每个操作都有一个IEnumerable&lt;T&gt;的扩展方法还有一个IQueryable&lt;T&gt;的扩展方法。
  • @cdhowie - 不完全是 - Queryable.Concat 将检查传入的IEnumerable 并使用底层查询表达式如果它是IQueryable。没有单独的重载。
  • @DStanley 我明白 OP 现在在说什么了。谢谢你提醒我;我已经在我的回答中包含了这个解释。
  • @cdhowie 在我的情况下,这会引发 The nested query is not supported. Operation1='UnionAll' Operation2='MultiStreamNest 异常。我正在尝试使用逻辑 OR 运算符实现复合过滤器。意味着用户可以链接: contains: OR contains: .
  • @Alex 我建议使用您的问题的详细信息打开一个新问题。如果没有更多信息(代码 sn-p 和正在使用的 Linq-to-SQL 引擎的详细信息),就无法提供帮助。
猜你喜欢
  • 2016-09-21
  • 1970-01-01
  • 1970-01-01
  • 2016-02-01
  • 2017-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-13
相关资源
最近更新 更多