一个数据库请求中的Concat IQueryable集合

时间:2014-09-02 21:20:07

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

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

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集合

1 个答案:

答案 0 :(得分:6)

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

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

进一步阅读:


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