2014-09-05 94 views
0

我在Entity Framwork中加入了兩個對象,並將Where子句中的所有條件都加入了。但是我的老闆說要把所有其他條件放在Where的謂詞中,這樣會更有效率。如下所示,第一個是我的版本 -連接之前Where謂詞中的條件vs Where子句

var query = from ct in dbContext.ClaimTrackings 
              join cts in dbContext.ClaimTrackingStatus 
              on ct.ID equals cts.ClaimTrackingID 
              where ct.CenterID == centerID && ct.ClaimMonth == SharePointClaimProcessingData.ClaimMonth && ct.ClaimYear == SharePointClaimProcessingData.ClaimYear 
              select cts; 




var query = from ct in dbContext.ClaimTrackings.Where(p => p.CenterID == centerID && p.ClaimMonth == SharePointClaimProcessingData.ClaimMonth && p.ClaimYear == SharePointClaimProcessingData.ClaimYear) 
              join cts in dbContext.ClaimTrackingStatus 
              on ct.ID equals cts.ClaimTrackingID 
              select cts; 

我看不到生成的腳本,因爲此代碼只能在生產中運行。 我不確定哪一個更有效率。所以請解釋一下。

+1

看起來他們很可能會產生相同或等價的SQL語句 - 你檢查系統產生當SQL你運行這些查詢?在枚舉之前發生的任何事情都將被轉換爲單個商店表達式,所以很有可能因爲這些返回相同的結果,查詢/計劃將是相同的。我可以爲你嘗試一系列類似的連接 – Charleh 2014-09-05 13:29:43

+0

查看我更新的帖子,由於某些限制,我無法在本地運行它。 – 2014-09-05 13:31:18

+0

也許我可以創建一個示例項目,並在我花點時間運行它。但我也想聽聽一些專家的意見。 – 2014-09-05 13:33:11

回答

0

好的我已經做了一些測試,我認爲是正確的 - 因爲結果是相同的,所以將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用來生成查詢的確切機制,但基本上你要加入兩個表並進行過濾,所以翻譯到商店查詢會給你相同的結果,很可能是因爲它看起來涉及的實體的方式

因此,在這種情況下,第二個猜測你的老闆(這是我做的所有的時間)是正確的:)