Почему LINQ to Entities делает для меня подзапрос? - PullRequest
3 голосов
/ 13 августа 2010

Я использую .NET 4 и Entity Framework для создания простого запроса. Вот код C #:

return Context.Files.Where(f => f.FileHash != 40)
                    .OrderByDescending(f => f.Created)
                    .Take(5);

Когда я отслеживаю запрос, используя ObjectQuery.ToTraceString(), я нахожу следующий подзапрос:

SELECT TOP (5)
  [Project1].[ID] AS [ID],
  -- <snip> lots of columns
  [Project1].[FileHash] AS [FileHash]
FROM ( SELECT
         [Extent1].[ID] AS [ID],
         -- <snip> lots of columns
         [Extent1].[FileHash] AS [FileHash]
       FROM [dbo].[Files] AS [Extent1]
       WHERE (LEN([Extent1].[FileHash])) <> 40
)  AS [Project1]
ORDER BY [Project1].[Created] DESC

FileHash определяется как NVARCHAR (255) .

Это кажется странным, поскольку я не вижу необходимости в подзапросе. Почему EF делает это для меня, и есть ли что-то, что я могу сделать, чтобы не принять то, что, как я полагаю, является ударом по производительности от такого запроса?

1 Ответ

3 голосов
/ 13 августа 2010

Прежде всего, я сомневаюсь, что об этом стоит беспокоиться. Я предполагаю, что если вы сравните план выполнения запроса для того, что генерирует EF, с планом «оптимального» рукописного запроса, результаты будут фактически идентичны. Я предполагаю, что единственное вероятное наказание заключается в том, что сгенерированный EF запрос будет занимать долю секунды дольше для анализа. В общей схеме это, вероятно, не стоит рассматривать.

Что касается того, почему EF генерирует запрос таким образом, я уверен, что это связано с внутренней сложностью перевода методов LINQ в допустимые запросы SQL. Я уверен, что движок, выполняющий этот перевод, очень модульный, и каждый модуль должен генерировать часть запроса, которая может быть легко включена в окончательный полный запрос. Хотя, безусловно, было бы возможно выполнить последний этап «оптимизации» для устранения избыточности, вероятно, очень мало вреда при делегировании этой задачи самому SQL Server.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...