Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
简单Linq查询对同一个表有重复的联接?_Linq_Entity Framework_Join - Fatal编程技术网

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

简单Linq查询对同一个表有重复的联接?,linq,entity-framework,join,Linq,Entity Framework,Join,(摘自Julia Lerman的《新实体框架》一书中的一个示例)我有一个数据库,其中有两个表,Contact和Address。联系人表有一个ContactID(int),以及名字、姓氏等。地址表有一个ContactID,以及城市、州、邮政编码等 下面是一个简单的LINQ查询: var addressGraphQuery = from a in context.Addresses.Include("Contact") orderby a.Contac

(摘自Julia Lerman的《新实体框架》一书中的一个示例)我有一个数据库,其中有两个表,Contact和Address。联系人表有一个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
它两次与联系人表连接!为什么?有没有一个简单的方法来防止这种情况


谜团加深了。当我删除orderby时,连接将消失。当我设置
context.ContextOptions.LazyLoadingEnabled=false
时,连接不会消失

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


我会看看是否有更高的幂,我可以问…

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

例如

霍布斯,
我不知道你为什么要得到内部和外部连接。Include对查询做了一些奇怪的事情。我已经向团队提出了你的问题,看看这是否是意料之中的(尽管它很糟糕),以及是否有办法缓解它。所讨论的查询只是一个示例,演示了在绑定时可以在查询中使用实体引用导航属性。

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

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:many,0..1:many时才会发生

谢谢,

卡蒂冰河
实体框架开发人员

微软

Hmmmmm,事实上,我可能错了!看:是的,你错了=)那么by()应该相当于Linq的orderby中的第二个排序顺序。不,我认为@Reddog是对的。如果查看SQL,它有[Extent2].[LastName]ASC、[Extent3].[FirstName]ASC的
顺序。当只需要一个查询时,通过两个不同的查询(Extent2、Extent3)排序。这是订单。我认为这个答案是正确的。(我想)看看下面的“ThenBy-Simple”示例。它将orderby与两个表达式一起使用,用逗号分隔。此语法相当于OrderBy().ThenBy()。为了完整性起见,我尝试了OrderBy().ThenBy(),但仍然存在一个重复的join=(我已合并了您创建的所有三个帐户。请注册,它将保存我(和其他mod)一段时间。另外,为了将来的参考,评论是用来评论的,答案是用来回答的。请检查并欢迎使用SO。我刚刚在NuGet中出现的最新版本中尝试了这个问题,我仍然看到Hobbes描述的查询。这方面有什么更新吗?实际上,这已经在最新的6月CTP中修复--(但在NuGet版本中还没有)这是在4.3.1版本中修复的还是仅在EF5中修复的?我对1:1或1:0..1联接也有同样的问题。最初它似乎没有影响,但最终数据增长导致了问题。通过添加愚蠢的
。其中(x=>x.table1!=null&&x.table2!=null)
condition它导致dup连接被插入到SQL能够更好地处理并返回性能的子查询中。非常奇怪。@Kati lceva,此错误仍然存在于EF 6.1.3中。此错误仍然存在于EF 6.1.3中
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