简单的Linq查询对同一个表有重复的连接?

Hob*_*bes 7 linq entity-framework join

(来自Julia Lerman的新实体框架书中的一个例子.)我有一个包含两个表的数据库,联系人和地址.Contact表有一个ContactID(int),以及名字,姓氏等.地址表有一个ContactID,以及city,state,zip等.

这是一个简单的LINQ查询:

var addressGraphQuery = from a in context.Addresses.Include("Contact")
                        orderby a.Contact.LastName, a.Contact.FirstName
                        select a;
Run Code Online (Sandbox Code Playgroud)

从SQL事件探查器,我看到以下内容:

SELECT 
    [Extent1].[addressID] AS [addressID], 
    [Extent1].[City] AS [City], 
    [Extent1].[StateProvince] AS [StateProvince], 
    -- etc
    [Extent3].[ContactID] AS [ContactID1], 
    [Extent3].[FirstName] AS [FirstName], 
    [Extent3].[LastName] AS [LastName], 
    -- etc
FROM   [dbo].[Address] AS [Extent1]
INNER JOIN [dbo].[Contact] AS [Extent2] ON [Extent1].[ContactID] = [Extent2].[ContactID]
LEFT OUTER JOIN [dbo].[Contact] AS [Extent3] ON [Extent1].[ContactID] = [Extent3].[ContactID]
ORDER BY [Extent2].[LastName] ASC, [Extent3].[FirstName] ASC
Run Code Online (Sandbox Code Playgroud)

它连接两次联系表!为什么?有没有一种简单的方法来防止这种情况?


神秘感加深了.当我删除orderby时,连接消失.当我设置时,连接不会消失context.ContextOptions.LazyLoadingEnabled = false.

这里也有一个类似的问题:

实体框架4中有太多左外连接?

我会看看是否有更高的功率我可以问...

小智 8

感谢您报告此问题.是的,预计不会看到两个连接.这是一个已在当前(尚未发布)位中修复的错误.在当前位中,相同的查询产生:

SELECT
[Extent1].[Id] AS [Id],
[Extent1].[Name] AS [Name],
[Extent1].[ContactId] AS [ContactId],
...
[Extent2].[Id] AS [Id1],
..
[Extent2].[FirstName] AS [FirstName],
[Extent2].[LastName] AS [LastName]
FROM  [dbo].[Address] AS [Extent1]
INNER JOIN [dbo].[Contact] AS [Extent2] ON [Extent1].[ContactId] = [Extent2].[Id] ORDER BY [Extent2].[LastName] ASC, [Extent2].[FirstName] ASC
Run Code Online (Sandbox Code Playgroud)

我有点玩的表明即使在4.0上这只会在关系为1时发生:很多,0..1:很多看起来很好.

谢谢,

Kati Iceva
实体框架开发人员
Microsoft


Red*_*dog 0

我倾向于使用 lambda 语法,所以我可能会错,但我想您会发现您希望 order by 子句的第二部分实际上是“then by”。

例如

var query = context.Addresses.Include("Contact")
                   .OrderBy(a => a.Contact.LastName)
                   .ThenBy(a => a.Contact.FirstName)
Run Code Online (Sandbox Code Playgroud)