看着分析器,我看到了一些差异。使用的第二个查询包括实际上将返回与辅助表CountryCodes相关的数据。这部分对我来说很有意义。但我不明白为什么这个查询有两个连接。首先它在CountryCodes和CountyCodeTypes(在外键上)之间进行常规的内连接,我认为这足以返回包括所需的所有内容。然而,它然后做另一个外部联接。为什么?这两个LINQ查询有什么区别?
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作为连接的手段,因为导航属性知道如何基于键来连接实体。
这不是你的问题的SQL是否由第一或第二的LINQ查询生成非常清楚... – 2010-10-15 00:12:59