OrderBy后跟Skip和Take编译成查询还是在内存中运行?

时间:2013-08-01 19:53:08

标签: entity-framework entity-framework-4 linq-to-entities

说我有这样的查询:

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

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

这样的事情怎么样:

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

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

2 个答案:

答案 0 :(得分: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查询的宝贵工具。

答案 1 :(得分:1)

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

您可以使用SQL事件探查器验证这一点。