2

次のようなクエリがあるとします。

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);

この場合、SkipandTakeの部分はサーバー上で実行されますか、それともメモリ内で実行されますか?

4

2 に答える 2

3

このクエリは SQL に変換されます。次のような Entity Framework クエリ

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

EF クエリ (およびその他のクエリ) を実行し、結果と対応する SQL を表示できるユーティリティであるLinqPadをダウンロードすることをお勧めします。これは、高品質の EF クエリを開発する上で非常に貴重なツールです。

于 2013-08-01T20:22:57.030 に答える
1

はい、SQL に変換されます。これは、ページングに不可欠です。

これは、SQL プロファイラーを使用して確認できます。

于 2013-08-01T20:10:53.970 に答える