我正在使用.NET 4和實體框架來構造一個簡單的查詢。下面是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 2010-08-12 23:30:03
如果沒有'.Take(5)',你會得到什麼? – 2010-08-12 23:43:23
@nos:我的部分是純粹的假設。我想我更加好奇結果的嚴謹表現的不直觀性。 – ladenedge 2010-08-13 00:56:25