Я использую .NET 4 и Entity Framework для создания простого запроса. Вот C# код:Почему LINQ to Entities делает подзапрос для меня?
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 делает это для меня, и есть ли что-то, что я могу сделать, чтобы не взять то, что я предполагаю, - это удар производительности из такого запроса?
Почему вы предполагаете, что это удар по производительности, а не усиление производительности (т. Е. Вы его измеряли/смотрели на план запроса)? – nos
Что вы получаете без '.Take (5)'? –
@nos: чистый предположение с моей стороны. Наверное, мне больше любопытно, насколько неуверенность в результате имеет строгая производительность. – ladenedge