簡體   English   中英

這兩個LINQ查詢之間有什么區別?

[英]What is the difference between these two LINQ queries?

看一下分析器,我看到了一些差異。 使用include的第二個查詢實際上將返回與輔助表CountryCodes相關的數據。 這部分對我有意義。 但是我不明白為什么這個查詢有兩個連接。 首先,它在CountryCodes和CountyCodeTypes(在外鍵上)之間進行常規內連接,我認為這足以返回包含所需的所有內容。 然而,它然后做另一個外連接。 為什么?

var query = from codes in base.context.CountryCodes
            join codeTypes in base.context.CountryCodeTypes
            on codes.CountryCodeTypeId equals codeTypes.CountryCodeTypeId
            where codeTypes.CountryCodeTypeName == countryCodeType
            select codes;

var query = from codes in base.context.CountryCodes.Include("CountryCodeType")
            where codes.CountryCodeType.CountryCodeTypeName == countryCodeType
            select codes;

結果sql:

 FROM   [dbo].[CountryCode] AS [Extent1]
 INNER JOIN [dbo].[CountryCodeType] AS [Extent2] ON [Extent1].[CountryCodeTypeId] = [Extent2].[CountryCodeTypeId]
 LEFT OUTER JOIN [dbo].[CountryCodeType] AS [Extent3] ON [Extent1].[CountryCodeTypeId] = [Extent3].[CountryCodeTypeId]
 WHERE [Extent2].[CountryCodeTypeName] = @p__linq__0

另外,如果我實際上需要在我的結果中填充外鍵表中的數據,我應該使用.Include,否則使用連接? 換句話說,我不應該使用.Include作為連接的手段,因為導航屬性知道如何根據鍵為我加入實體。

這只是Entity Framework生成的SQL的本質。

INNER JOIN因您的where語句而存在。

where codes.CountryCodeType.CountryCodeTypeName == countryCodeType

EF可以解決此問題的唯一方法是執行INNER JOIN,正如您正確指出的那樣。 你也注意到INNER JOIN確實返回了滿足Include()所需的所有數據。

但是,OUTER JOIN仍然執行,因為EF看到Include()並將其解析為需要連接。 考慮一下你沒有where子句的情況 - 那么你需要一個OUTER JOIN,對嗎? 在這種情況下,EF不夠聰明,無法確定是否需要OUTER JOIN; 它看到一個Include()然后生成相關的OUTER JOIN以確保滿足數據要求。 換句話說,它不會考慮您的其余查詢來確定是否需要連接 - 它只是無論如何都可以。

關於Include()運算符,只有在想要將這些相關對象檢索回應用程序時才會使用它。 此查詢不需要它。 在這種情況下最簡單的查詢是

var query = from codes in base.context.CountryCodes
            where codes.CountryCodeType.CountryCodeTypeName == countryCodeType
            select codes;

由於codes.CountryCodeType.CountryCodeTypeName == countryCodeType ,左外連接發生,而內連接恰好允許它在最終結果中包含CountryCodeType表中的字段。

如果您不需要結果中的外鍵表中的數據,則無需使用“包括” 或“加入”。 如果您沒有使用“Include”,它將只使用左外連接,而不使用內連接。

我猜這個框架根本不夠智能,沒有意識到它已經在該表上完成了連接,並且可以在那里重用信息。 希望SQL Server足夠聰明,可以接受並使用執行計划,避免重復這種努力。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM