我在 “EF 对象”的 IQueryable上使用Project()将其映射到数据层中“POCO 模型”的 IQueryable 。
生成的 SQL 语句对同一个表有 20 个 LEFT JOIN。有没有人见过这种行为?
被查询的对象有一个嵌套的复杂对象。
我在 “EF 对象”的 IQueryable上使用Project()将其映射到数据层中“POCO 模型”的 IQueryable 。
生成的 SQL 语句对同一个表有 20 个 LEFT JOIN。有没有人见过这种行为?
被查询的对象有一个嵌套的复杂对象。
我也有同样的问题。我不知道该怎么办,但我想我明白问题所在。简而言之,实体框架在某些查询结构中重复连接,而 AutoMapper 使用这些查询结构。
当 Entity Framework 在 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()
,它们可能会单独且完整地生成每个“选择”映射,就像在第一个示例中一样。他们可能会看到他们想要重用哪些关系/联接,但取决于他们如何构建查询,let
语法可能对他们不可用。