2

假设我有一个这样的查询:

var result=collection.OrderBy(orderingFunction).Skip(start).Take(length);

整个查询会在 SQL Server 上运行并返回结果,还是会返回整个有序表然后SkipTake内存中运行?我很担心,因为我注意到OrderBy返回IOrderedEnumerable

像这样的东西怎么样:

if(orderAscending)
   orderedCollection=collection.OrderBy(orderingFunction);
else
   orderedCollection=collection.OrderByDescending(orderingFunction);
var result=orderedCollection.Skip(start).Take(length);

Skip在这种情况下, and部分会Take在服务器上运行还是在内存中运行?

4

2 回答 2

3

这个查询被翻译成 SQL。实体框架查询,例如

myTable.OrderBy(row => row.Id).Skip(10).Take(20); 

将产生类似于以下的 SQL:

SELECT TOP (20) [Extent1].[Id] AS [Id]
FROM ( SELECT [Extent1].[Id], row_number() OVER (ORDER BY [Extent1].[Id] ASC) AS [row_number]
        FROM [my_table] AS [Extent1]
)  AS [Extent1]
WHERE [Extent1].[row_number] > 10
ORDER BY [Extent1].[Id] ASC

我建议下载LinqPad,这是一个允许您执行 EF 查询(和其他查询)并查看结果和相应 SQL 的实用程序。它是开发高质量 EF 查询的宝贵工具。

于 2013-08-01T20:22:57.030 回答
1

是的,它确实转换为 SQL。这对于分页至关重要。

您可以使用 SQL Profiler 验证这一点。

于 2013-08-01T20:10:53.970 回答