2016-01-08 23 views
-1

我有一些LINQ to SQL查询,并且想要得到他们union的结果。我是否需要首先运行ToList()?或者我可以让他们作为IQueryable和工会他们和工会结束时只需拨打一个ToList()?这是否有任何性能改善?或者它本质上是一回事?如果你结合两个查询,我们是否需要首先在它们每个上运行ToList()?

var query1 = (from a in this.Context.Blah select a); // .ToList()?? 
var query2 = (from b in this.Context.Yada select b); // .ToList()?? 
var query3 = (query1.Union(query2)).ToList(); 
+3

**这是否有任何性能改善?或者它本质上是相同的东西?** 'ToList()'降低了性能,因为它执行LINQ-to-SQL查询(命中数据库)。这将在实际工作之前完成2次(工会电话)。 不调用'ToList()'直到最终查询被构造,你就是'推迟执行'(并推迟到db的往返)。 在某些操作中,处理内存中的数据结果比使数据库在其上运行更快*。一个好的经验法则,“只要有可能,就让数据库完成这项工作。” – Alan

+0

这是特定于LINQ到XML的,但延迟评估的概念在所有LINQ类型中都很重要:https://msdn.microsoft.com/en-us/library/bb943859.aspx – Alan

回答

4

方案1:

var query1 = (from a in this.Context.Blah select a); // you have a query 
var query2 = (from b in this.Context.Yada select b); // you have another query 
var query3 = (query1.Union(query2)); // you build a new query 
var result = query3.ToList(); // you execute a query and get result 

方案2:

//this builds a query and execute it and get result from database 
var query1 = (from a in this.Context.Blah select a).ToList(); // you execute a query 

//this builds a query and execute it and get result from database 
var query2 = (from b in this.Context.Yada select b).ToList(); // you execute another query 

//this builds a query and execute it but it does not hit database because you are working 
//with IEnumerable here not IQueryable 
var query3 = (query1.Union(query2)); // you build a new query 
var result = query3.ToList(); // you execute another query and get result 

情景2执行3查询,并有2个往返数据库,而第一个就去拿你想要什么一次往返。

构建查询并执行它有很大的区别。调用方法如ToList,ToArray,First,Single和...将执行您建立的查询,因为像Where,UnionExceptExceptExcept这样的调用方法正在为您建立查询。

1

您应该让数据库联合数据集。它可能会比你做得更快,而且任何被删除的项目都不需要通过网络发送给你。

+0

hmm?从你的回答中,我仍然没有记下来,我是否需要打电话给ToList?谢谢。 – Bohn

+3

@Bohn然后它听起来像你需要花一些时间阅读LINQ教程的介绍,并阅读ToList等方法的文档。 – Servy

相关问题