ページングを実装するために、EF CodeFirst でTake
andステートメントを使用しています ( Zoran Maksimovicがこの投稿で述べたように)。これらのステートメントにより、EF は次のような SQL クエリを生成します (私のページ サイズは 100 です)。Skip
SELECT TOP (100) [Filter1].[Id] AS [Id],
[Filter1].[SendDuration] AS [SendDuration]
FROM (SELECT [Extent1].[Id] AS [Id],
[Extent1].[SendDuration] AS [SendDuration],
row_number() OVER (ORDER BY [Extent1].[SendDuration] DESC) AS [row_number]
FROM [dbo].[MyView] AS [Extent1]
WHERE (1293>= [Extent1].[Id])
)AS [Filter1]
WHERE [Filter1].[row_number] > 500
ORDER BY [Filter1].[SendDuration] DESC
しかし、このSQLはSQLサーバーで実行すると非常に遅くなりますが、Boanergeがコメントで述べたように、row_number < X
代わりに使用するTop(y)
とパフォーマンスが向上します。つまり、生成されたSQLを次のように変更すると:
SELECT [Filter1].[Id] AS [Id],
[Filter1].[SendDuration] AS [SendDuration]
FROM (SELECT [Extent1].[Id] AS [Id],
[Extent1].[SendDuration] AS [SendDuration],
row_number() OVER (ORDER BY [Extent1].[SendDuration] DESC) AS [row_number]
FROM [dbo].[MyView] AS [Extent1]
WHERE (1293>= [Extent1].[Id])
)AS [Filter1]
WHERE [Filter1].[row_number] > 500 and [Filter1].[row_number] <= 600
ORDER BY [Filter1].[SendDuration] DESC
クエリの実行時間が改善され、許容範囲が広がります (場合によっては 4 倍または 5 倍速くなります)。EF に 1 番目の Sql ではなく 2 番目の Sql を強制的に生成させる方法はありますか?