看到分析器,我发现有几个不同之处。使用include的第二个查询实际上会返回与次要表CountryCodes相关的数据。这部分对我来说很有意义。然而,我不明白为什么这个查询有两个连接。首先,它在CountryCodes和CountyCodeTypes之间进行常规内连接(根据外键),我认为这足以返回include所需的所有内容。但是它随后又进行了另一个外连接。为什么呢?
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,否则应该使用join吗?换句话说,我不应该将.Include用作连接的手段,因为导航属性知道如何根据键连接实体。