(来自Julia Lerman的新实体框架书中的一个例子。)我有一个包含两个表的数据库,联系人和地址。 Contact表有一个ContactID(int),以及名字,姓氏等。地址表有一个ContactID,以及城市,州,邮政等。
这是一个简单的LINQ查询:
var addressGraphQuery = from a in context.Addresses.Include("Contact")
orderby a.Contact.LastName, a.Contact.FirstName
select a;
从SQL Profiler中,我看到以下内容:
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
它与Contact表连接两次!为什么?有没有一种简单的方法可以防止这种情况发生?
神秘感加深了。当我删除orderby时,连接消失。当我设置context.ContextOptions.LazyLoadingEnabled = false
时,联接不会消失。
这里也有类似的问题:
Too Many Left Outer Joins in Entity Framework 4?
我会看到是否有更高的权力我可以问......
答案 0 :(得分: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
我有点玩的表明即使在4.0上这只会在关系为1时发生:很多,0..1:很多看起来很好。
谢谢,
Kati Iceva
实体框架开发人员
微软
答案 1 :(得分:1)
霍布斯, 我不知道你为什么同时获得内部和外部联接。包含查询的奇怪内容。我已经把你的问题提交给团队,看看是否有预期(尽管它是坏的)以及是否有办法减轻它。有问题的查询只是一个示例,用于演示如果进入绑定,可以在查询中使用实体引用导航属性。
答案 2 :(得分:0)
我倾向于使用lambda语法,所以我可能错了,但我认为你会发现你希望order by子句的第二部分实际上是“then by”。
E.g。
var query = context.Addresses.Include("Contact")
.OrderBy(a => a.Contact.LastName)
.ThenBy(a => a.Contact.FirstName)