好的我已經做了一些測試,我認爲是正確的 - 因爲結果是相同的,所以將where子句移到更高位置根本沒有區別 - 當然對於SQL服務器。
剛跑的情況下這兩個查詢爲我們的客戶端應用程序(只是換出你的實體名稱爲礦山)中的一個:
var query = from ct in _context.Batches
join cts in _context.Blends
on ct.BatchId equals cts.BatchId
where ct.BatchId == 13349 && ct.CreatedBy == "Automation"
select cts;
var query2 = from ct in _context.Batches.Where(x => x.BatchId == 13349 && x.CreatedBy == "Automation")
join cts in _context.Blends
on ct.BatchId equals cts.BatchId
select cts;
的等效查詢:
SELECT
[Extent2].[BlendId] AS [BlendId],
[Extent2].[BatchId] AS [BatchId],
[Extent2].[BlendNumber] AS [BlendNumber],
[Extent2].[ProductCode] AS [ProductCode],
[Extent2].[TargetQuantity] AS [TargetQuantity],
[Extent2].[RecipeDescription] AS [RecipeDescription],
[Extent2].[BlenderId] AS [BlenderId],
[Extent2].[TestingSetDescription] AS [TestingSetDescription],
[Extent2].[SieveDefaultDescription] AS [SieveDefaultDescription],
[Extent2].[ReblendTime] AS [ReblendTime],
[Extent2].[Operator] AS [Operator],
[Extent2].[ProcessedBy] AS [ProcessedBy],
[Extent2].[KeggedBy] AS [KeggedBy],
[Extent2].[ApprovedBy] AS [ApprovedBy],
[Extent2].[ActualQuantity] AS [ActualQuantity],
[Extent2].[TestedBy] AS [TestedBy],
[Extent2].[TestStatus] AS [TestStatus],
[Extent2].[ApprovedQuantity] AS [ApprovedQuantity],
[Extent2].[CreatedDate] AS [CreatedDate]
FROM [dbo].[Batches] AS [Extent1]
INNER JOIN [dbo].[Blends] AS [Extent2] ON [Extent1].[BatchId] = [Extent2].[BatchId]
WHERE (13349 = [Extent1].[BatchId]) AND (N'Automation' = [Extent1].[CreatedBy])
而且
SELECT
[Extent2].[BlendId] AS [BlendId],
[Extent2].[BatchId] AS [BatchId],
[Extent2].[BlendNumber] AS [BlendNumber],
[Extent2].[ProductCode] AS [ProductCode],
[Extent2].[TargetQuantity] AS [TargetQuantity],
[Extent2].[RecipeDescription] AS [RecipeDescription],
[Extent2].[BlenderId] AS [BlenderId],
[Extent2].[TestingSetDescription] AS [TestingSetDescription],
[Extent2].[SieveDefaultDescription] AS [SieveDefaultDescription],
[Extent2].[ReblendTime] AS [ReblendTime],
[Extent2].[Operator] AS [Operator],
[Extent2].[ProcessedBy] AS [ProcessedBy],
[Extent2].[KeggedBy] AS [KeggedBy],
[Extent2].[ApprovedBy] AS [ApprovedBy],
[Extent2].[ActualQuantity] AS [ActualQuantity],
[Extent2].[TestedBy] AS [TestedBy],
[Extent2].[TestStatus] AS [TestStatus],
[Extent2].[ApprovedQuantity] AS [ApprovedQuantity],
[Extent2].[CreatedDate] AS [CreatedDate]
FROM [dbo].[Batches] AS [Extent1]
INNER JOIN [dbo].[Blends] AS [Extent2] ON [Extent1].[BatchId] = [Extent2].[BatchId]
WHERE (13349 = [Extent1].[BatchId]) AND (N'Automation' = [Extent1].[CreatedBy])
不出所料,它們是相同的。我不能給你EF用來生成查詢的確切機制,但基本上你要加入兩個表並進行過濾,所以翻譯到商店查詢會給你相同的結果,很可能是因爲它看起來涉及的實體的方式
因此,在這種情況下,第二個猜測你的老闆(這是我做的所有的時間)是正確的:)
看起來他們很可能會產生相同或等價的SQL語句 - 你檢查系統產生當SQL你運行這些查詢?在枚舉之前發生的任何事情都將被轉換爲單個商店表達式,所以很有可能因爲這些返回相同的結果,查詢/計劃將是相同的。我可以爲你嘗試一系列類似的連接 – Charleh 2014-09-05 13:29:43
查看我更新的帖子,由於某些限制,我無法在本地運行它。 – 2014-09-05 13:31:18
也許我可以創建一個示例項目,並在我花點時間運行它。但我也想聽聽一些專家的意見。 – 2014-09-05 13:33:11