我有一个产品实体,它有0或1个"BestSeller"实体.出于某种原因我说:
db.Products.OrderBy(p => p.BestSeller.rating).ToList();
Run Code Online (Sandbox Code Playgroud)
我得到的SQL有一个"额外的"外连接(下面).如果我添加第二个0或1关系,并按两者排序,那么我得到4个外连接.似乎每个这样的实体产生2个外连接而不是一个.LINQ to SQL完全按照您的预期运行,没有额外的连接.
有没有其他人经历过这个,或者知道如何修复它?
SELECT
[Extent1].[id] AS [id],
[Extent1].[ProductName] AS [ProductName]
FROM [dbo].[Products] AS [Extent1]
LEFT OUTER JOIN [dbo].[BestSeller] AS [Extent2] ON [Extent1].[id] = [Extent2].[id]
LEFT OUTER JOIN [dbo].[BestSeller] AS [Extent3] ON [Extent2].[id] = [Extent3].[id]
ORDER BY [Extent3].[rating] ASC
Run Code Online (Sandbox Code Playgroud) (来自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.
这里也有一个类似的问题:
我会看看是否有更高的功率我可以问...