说我有这样的查询:
var result=collection.OrderBy(orderingFunction).Skip(start).Take(length);
整个查询是在SQL服务器上运行并返回结果,还是会返回整个有序表,然后在内存中运行Skip
和Take
?我很担心,因为我注意到OrderBy
返回IOrderedEnumerable
。
这样的事情怎么样:
if(orderAscending)
orderedCollection=collection.OrderBy(orderingFunction);
else
orderedCollection=collection.OrderByDescending(orderingFunction);
var result=orderedCollection.Skip(start).Take(length);
在这种情况下,Skip
和Take
部分会在服务器上还是在内存中运行?
答案 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事件探查器验证这一点。