Entity framework 为1-1关系上的IN-filter生成的查询两次连接到父表

Entity framework 为1-1关系上的IN-filter生成的查询两次连接到父表,entity-framework,sql-server-2008-r2,Entity Framework,Sql Server 2008 R2,我有这个问题,并用AdventureWorks2008R2复制了它,使它更简单。基本上,我想过滤父表中的IN值列表,我想它会生成这种类型的查询 但事实并非如此。 如何将LINQ语句更改为仅查询一次头? (忽略我在guid上匹配的事实-它实际上是整数;我只是快速地在EF中查找1-1表,因为这就是问题发生的时候,我碰巧找到了这些表) 这将生成以下更昂贵的查询: 选择[Extent1].[BusinessEntityID]作为[BusinessEntityID], [Extent1]。[Perso

我有这个问题,并用AdventureWorks2008R2复制了它,使它更简单。基本上,我想过滤父表中的IN值列表,我想它会生成这种类型的查询 但事实并非如此。

如何将LINQ语句更改为仅查询一次头?

(忽略我在guid上匹配的事实-它实际上是整数;我只是快速地在EF中查找1-1表,因为这就是问题发生的时候,我碰巧找到了这些表)

这将生成以下更昂贵的查询:

选择[Extent1].[BusinessEntityID]作为[BusinessEntityID],
[Extent1]。[PersonType]作为[PersonType],
[Extent1]。[NameStyle]作为[NameStyle],
[Extent1].[Title]作为[Title],
[Extent1]。[FirstName]作为[FirstName],
[Extent1]。[MiddleName]作为[MiddleName],
[Extent1].[LastName]作为[LastName],
[Extent1].[Suffix]作为[Suffix],
[Extent1]。[EmailPromotion]作为[EmailPromotion],
[Extent1]。[AdditionalContactInfo]作为[AdditionalContactInfo],
[Extent1]。[Demographics]作为[Demographics],
[Extent1]。[rowguid]作为[rowguid],
[Extent1][ModifiedDate]作为[ModifiedDate]
从[Person].[Person]作为[extend1]
在[Extent1].[BusinessEntityID]=[Extent2].[BusinessEntityID]上将[Person].[BusinessEntity]作为[Extent2]进行内部联接
在[Extent1].[BusinessEntityID]=[Extent3].[BusinessEntityID]上将[Person].[BusinessEntity]作为[Extent3]左外部联接
其中[Extent2].[rowguid]=cast('b95b63f9-6304-4626-8e70-0bd2b73b6b0f'作为唯一标识符)或[Extent3].[rowguid]IN(cast('f917a037-b86b-4911-95f4-4afc17433086'作为唯一标识符),cast('3188557d-5df9-40b3-90ae-f83deee2be05'作为唯一标识符))

真奇怪。看起来像是LINQ限制

我现在没有一个系统来尝试这个,但是如果您首先根据提供的guid获取BusinessEntityId值列表,然后获取这样的人员

var g = context.People.Where(p => businessEntityIdList.Contains(p.BusinessEntityId)).ToList();
不应该再有其他不必要的连接的理由了


如果这样做有效,您可以尝试将to步骤合并到一个LINQ表达式中,以查看分离是否保持不变。

我想说这没有帮助,因为这与我给出的LINQ语句相同。但它确实让我想到了用LINQ和join字手动连接这两个表。这对本案有效,但会削弱任何其他想法:D
var guidsToFind = new Guid[] { Guid.NewGuid(), Guid.NewGuid(), Guid.NewGuid()};
AdventureWorks2008R2Entities context = new AdventureWorks2008R2Entities();
var g = context.People.Where(p => guidsToFind.Contains(p.BusinessEntity.rowguid)).ToList();
var g = context.People.Where(p => businessEntityIdList.Contains(p.BusinessEntityId)).ToList();