我在我的 IQueryable of“EF Object”上使用 Project()将它映射到“POCO Model”的IQueryable 在数据层中。
生成的SQL语句对同一个表有20个LEFT JOIN。有没有人见过这种行为?
正在查询的对象有一个嵌套的复杂对象。
答案 0 :(得分:1)
我有同样的问题。我不知道该怎么办,但我想我明白了问题所在。简而言之,Entity Framework在某些查询结构中复制了连接,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()
时,他们可能会单独和完全生成每个“选择”映射,就像在第一个示例中一样。他们可能有可能看到他们想要重用哪些关系/联接,但是根据他们如何构建查询,let
语法可能对他们不可用。