自动映射 - 使用EF进行投影会生成丑陋的sql

时间:2014-10-08 14:49:47

标签: entity-framework automapper projection automapper-2

我在我的 IQueryable of“EF Object”上使用 Project()将它映射到“POCO Model”的IQueryable 在数据层中。

生成的SQL语句对同一个表有20个LEFT JOIN。有没有人见过这种行为?

正在查询的对象有一个嵌套的复杂对象。

1 个答案:

答案 0 :(得分:1)

我有同样的问题。我不知道该怎么办,但我想我明白了问题所在。简而言之,Entity Framework在某些查询结构中复制了连接,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()时,他们可能会单独和完全生成每个“选择”映射,就像在第一个示例中一样。他们可能有可能看到他们想要重用哪些关系/联接,但是根据他们如何构建查询,let语法可能对他们不可用。