使用 Entity Framework ,理论上更快:
// (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 的经验,在数据库上完成时几乎所有事情都会更快。
PS 我的环境中没有性能工具,并且不确定如何测试它,因此提出了这个问题。
最佳答案
您的查询正在编译并在您调用 ToDictionary
时执行,因此 1 和 2 应该相同并产生相同的查询:您得到 SELECT FieldA, FieldB FROM table ORDER BY FieldA
在这两种情况下。
第三个不同:首先执行 SQL 查询(不带 ORDER BY
子句),然后在内存中对返回的集合进行排序(数据不是由数据库提供程序排序,而是由客户端排序)。这可能会更快或更慢,具体取决于数据量、服务器和客户端的硬件、数据库的设计方式(索引等)、网络基础设施等。
根据您提供的信息,无法判断哪一个更快
PS:这没有任何意义 Dictionary
并不真正关心顺序(我不认为 3 会编译,因为 Dictionary<>
,如果我没记错的话,没有 OrderBy
),但是更改 ToDictionary
。至ToList
这就是您的性能答案
关于c# - 对 EF-to-Linq 查询进行排序的最快方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33252346/