2014-10-08 58 views
1

我使用我的的IQueryable的“EF对象”项目()给它的数据层映射到“POCO模型”的 IQueryable的。

生成的SQL语句具有20个到同一个表的LEFT JOIN。有没有人看过这种行为?
Automapper - 突起与EF产生难看SQL

被查询的对象具有嵌套的复杂对象。

+0

至少在我的情况下,它看起来与项目有关。如果我不通过项目,EF会生成一个干净的SQL。 – jDeveloper 2014-11-05 20:51:37

回答

1

我有同样的问题。我不知道该怎么做,但我想我明白问题所在。简而言之,实体框架会复制某些查询结构中的连接,并且AutoMapper会使用这些查询结构。

当实体框架在linq查询中看到entity.Relationship.Field1entity.Relationship.Field2时,它会为每个字段生成一个单独的联接。 例如:

from entity in dbSet 
select new { entity.Relationship.Field1, entity.Relationship.Field2 } 

可能生成的SQL语句:

SELECT [Extent2].[Field1], [Extent3].[Field2] 
FROM EntityTable AS [Extent1] 
JOIN RelatedTable AS [Extent2] ON [Extent1].[RelationshipID] = [Extent2].[ID] 
JOIN RelatedTable AS [Extent3] ON [Extent1].[RelationshipID] = [Extent3].[ID] 

通常,这种双重连接可以通过这样写LINQ避免:

from entity in dbSet 
let relatedValue = entity.Relationship 
select new { relatedValue.Field1, relatedValue.Field2 } 

生产:

SELECT [Extent2].[Field1], [Extent2].[Field2] 
FROM EntityTable AS [Extent1] 
JOIN RelatedTable AS [Extent2] ON [Extent1].[RelationshipID] = [Extent2].[ID] 

不幸的是,你在AutoMapper中没有这个控件。当使用.Project().To()时,他们可能会分别完全生成每个“选择”映射,就像第一个示例中那样。他们可能会看到他们想要重用的关系/连接,但根据他们如何构建查询,他们可能无法使用语法。

+0

此解决方案解决方案适用于我。关于这个问题有一个讨论。它是你@EnvisionAndDevelop https://github.com/AutoMapper/AutoMapper/issues/621 – 2017-10-19 04:20:35