Оператор Entity Framework Take, потому что EF генерирует неэффективный SQL-запросC#

Место общения программистов C#
Anonymous
Оператор Entity Framework Take, потому что EF генерирует неэффективный SQL-запрос

Сообщение Anonymous »

Я использую операторы Take и Skip в EF CodeFirst для реализации пейджинга (как сказал Зоран Максимович в этом посте), эти операторы заставляют EF генерировать такой SQL-запрос (размер моей страницы равно 100):

Код: Выделить всё

 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-сервере, но, как сказал Боанерге в своем комментарии, используя row_number < X вместо Top(y)< /code> приводит к увеличению производительности. я имею в виду, что если я изменю сгенерированный 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] 

Подробнее здесь: [url]https://stackoverflow.com/questions/17258678/entity-framework-take-statement-cause-ef-generates-unefficient-sql-query[/url]

Вернуться в «C#»