Entity Frameworkを使用してサーバー側のページングを実装しており、次のコードがあります
DbQuery<T> query = Context.Set<T>();
query = IncludeNavigationProperties(query, includedProperties);
var result = query.OrderBy(arg => arg.DatabaseId)
.Skip((pageNumber - 1)*pageSize)
.Take(pageSize).ToList();
これにより、必要なデータのみを照会する SQL が生成されます (SQL Server Profiler で確認)
SELECT TOP (21)
[Extent1].[DatabaseId] AS [DatabaseId],
...[other props here]...
FROM ( SELECT [Extent1].[DatabaseId] AS [DatabaseId], ...[other props here]..., row_number() OVER (ORDER BY [Extent1].[DatabaseId] ASC) AS [row_number]
FROM [dbo].[Table] AS [Extent1]
) AS [Extent1]
WHERE [Extent1].[row_number] > 84
ORDER BY [Extent1].[DatabaseId] ASC
keySelector
次に、このメソッドをより多くのシナリオで再利用し、extern 変数として渡すことにしました。
DbQuery<T> query = Context.Set<T>();
query = IncludeNavigationProperties(query, includedProperties);
var result = query.OrderBy(keySelector)
.Skip((pageNumber - 1)*pageSize)
.Take(pageSize).ToList();
どこ
Func<T, int> keySelector = arg => arg.DatabaseId;
しかし、突然次の SQL クエリが生成されます。
SELECT
[Extent1].[DatabaseId] AS [DatabaseId],
...[other props here]...
FROM [dbo].[Table] AS [Extent1]
私が理解しているように、テーブルからすべてのデータを照会し、サーバーで処理します。
だから、私は2つの質問があります:
- なぜクエリが変更されるのですか?
- どうすれば修正できますか (
keySelector
必要なデータのみを変更してクエリできるようにする)?