1

我在 “EF 对象”的 IQueryable上使用Project()将其映射到数据层中“POCO 模型”的 IQueryable 。 生成的 SQL 语句对同一个表有 20 个 LEFT JOIN。有没有人见过这种行为?

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

4

1 回答 1

1

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

当 Entity Framework 在 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语法可能对他们不可用。

于 2014-11-05T19:41:34.600 回答