使用实体框架,理论上更快:
// (1) sort then select/project
// in db, for entire table
var results = someQuery
.OrderBy(q => q.FieldA)
.Select(q => new { q.FieldA, q.FieldB })
.ToDictionary(q => q.FieldA, q => q.FieldB);
或
// (2) select/project then sort
// in db, on a smaller data set
var results = someQuery
.Select(q => new { q.FieldA, q.FieldB })
.OrderBy(q => q.FieldA)
.ToDictionary(q => q.FieldA, q => q.FieldB);
或
// (3) select/project then materialize then sort
// in object space
var results = someQuery
.Select(q => new { q.FieldA, q.FieldB })
.ToDictionary(q => q.FieldA, q => q.FieldB)
.OrderBy(q => q.FieldA); // -> this won't compile, but you get the question
我不是SQL专家,但从直觉上看,2比1更快......这是正确的吗?这与3相比如何,因为根据我对EF的经验,几乎在db上完成所有事情都会更快。
PS我的环境中没有穿孔工具,也不确定如何测试,因此问题。
答案 0 :(得分:4)
您的查询正在编译并在您致电ToDictionary
时执行,因此1和2应该相同并产生相同的查询:在这两种情况下都会得到SELECT FieldA, FieldB FROM table ORDER BY FieldA
。
第三种不同:首先执行SQL查询(不带ORDER BY
子句),然后将返回的内存排序在内存中(数据不是由数据库提供程序排序,而是由客户端排序)。这可能更快或更慢,具体取决于数据量,服务器和客户端的硬件,以及数据库的设计方式(索引等),网络基础架构等等。
根据您提供的信息,无法确定哪一个会更快
PS:这没有任何意义,因为Dictionary
并不真正关心订单(我不认为3会自Dictionary<>
编译,如果我不是错误,没有OrderBy
),但是将ToDictionary
更改为ToList
并且您的绩效答案是