方案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
,Union
,Except
和Except
和Except
这样的调用方法正在为您建立查询。
**这是否有任何性能改善?或者它本质上是相同的东西?** 'ToList()'降低了性能,因为它执行LINQ-to-SQL查询(命中数据库)。这将在实际工作之前完成2次(工会电话)。 不调用'ToList()'直到最终查询被构造,你就是'推迟执行'(并推迟到db的往返)。 在某些操作中,处理内存中的数据结果比使数据库在其上运行更快*。一个好的经验法则,“只要有可能,就让数据库完成这项工作。” – Alan
这是特定于LINQ到XML的,但延迟评估的概念在所有LINQ类型中都很重要:https://msdn.microsoft.com/en-us/library/bb943859.aspx – Alan