从理论上讲,使用实体框架会更快:
// (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我的环境中没有性能工具,也不确定如何测试它,因此是一个问题。
您的查询正在编译并正在执行查询ToDictionary
,因此1和2应该相同并且产生相同的查询:SELECT FieldA, FieldB FROM table ORDER BY FieldA
在两种情况下都得到a 。
第三点是不同的:首先执行SQL查询(不带ORDER BY
子句),然后对返回的内存集进行排序(数据不是由DB提供程序排序,而是由客户端排序)。这可能更快或更慢,具体取决于数据量,服务器和客户端的硬件以及数据库的设计方式(索引等),网络基础结构等等。
无法通过您提供的信息来判断哪个会更快
PS:这是没有意义的,因为aDictionary
并不真正在乎顺序(我不认为3会编译,因为Dictionary<>
,如果我没有记错的话,没有OrderBy
),但是更改ToDictionary
为ToList
,这就是你的性能答案
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句