我使用我的的IQueryable的“EF对象”的项目()给它的数据层映射到“POCO模型”的 IQueryable的。
生成的SQL语句具有20个到同一个表的LEFT JOIN。有没有人看过这种行为?Automapper - 突起与EF产生难看SQL
被查询的对象具有嵌套的复杂对象。
我使用我的的IQueryable的“EF对象”的项目()给它的数据层映射到“POCO模型”的 IQueryable的。
生成的SQL语句具有20个到同一个表的LEFT JOIN。有没有人看过这种行为?Automapper - 突起与EF产生难看SQL
被查询的对象具有嵌套的复杂对象。
我有同样的问题。我不知道该怎么做,但我想我明白问题所在。简而言之,实体框架会复制某些查询结构中的连接,并且AutoMapper会使用这些查询结构。
当实体框架在linq查询中看到entity.Relationship.Field1
和entity.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()
时,他们可能会分别完全生成每个“选择”映射,就像第一个示例中那样。他们可能会看到他们想要重用的关系/连接,但根据他们如何构建查询,他们可能无法使用语法。
此解决方案解决方案适用于我。关于这个问题有一个讨论。它是你@EnvisionAndDevelop https://github.com/AutoMapper/AutoMapper/issues/621 – 2017-10-19 04:20:35
至少在我的情况下,它看起来与项目有关。如果我不通过项目,EF会生成一个干净的SQL。 – jDeveloper 2014-11-05 20:51:37