Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Entity framework core 包含在所有拆分查询中找到的引用导航属性的左外部联接语句_Entity Framework Core_Ef Core 2.2 - Fatal编程技术网

Entity framework core 包含在所有拆分查询中找到的引用导航属性的左外部联接语句

Entity framework core 包含在所有拆分查询中找到的引用导航属性的左外部联接语句,entity-framework-core,ef-core-2.2,Entity Framework Core,Ef Core 2.2,我有一个实体,其中包含多个引用导航属性 实体的存储库实现如下所示: return await _dbContext.MyEntity .Include(s => s.Address) //Reference Navigation .Include(s => s.BuildingDetails) //Reference Navigation

我有一个实体,其中包含多个引用导航属性

实体的存储库实现如下所示:

return await _dbContext.MyEntity
                                     .Include(s => s.Address) //Reference Navigation
                                     .Include(s => s.BuildingDetails) //Reference Navigation
                                        .ThenInclude(s => s.ChildOfBuildingDetails)
                                     .Include(s => s.ContactPersons)
                                     .Include(s => s.Technicians)
                                     .Include(s => s.DeactivationDetails)  //Reference Navigation
                                     .FirstOrDefaultAsync(s => s.Id == id, cancellationToken);
当我检查正在执行的实际DB查询时,所有查询都包含引用导航属性,这些属性作为父实体的连接包含在查询中

SELECT [m92].[Id], .......
FROM [MyDB].[ContactPersons] AS [m92]
INNER JOIN (
    SELECT DISTINCT [m93].[Id], [t76].[Id] AS [Id0]
    FROM [MyDB].[MyEntity] AS [m93]
    LEFT JOIN (
        SELECT [m94].*
        FROM [MyDB].[DeactivationDetails] AS [m94]
        WHERE [m94].[Deleted] = 0
    ) AS [t75] ON [m93].[Id] = [t75].[MyEntityId]
    LEFT JOIN (
        SELECT [m95].*
        FROM [MyDB].[BuildingDetails] AS [m95]
        WHERE [m95].[Deleted] = 0
    ) AS [t76] ON [m93].[Id] = [t76].[MyEntityId]
    LEFT JOIN (
        SELECT [m96].*
        FROM [MyDB].[Address] AS [m96]
        WHERE [m96].[Deleted] = 0
    ) AS [t77] ON [m93].[Id] = [t77].[MyEntityId]
    WHERE [m93].[Deleted] = 0
) AS [t78] ON [m92].[MyEntityId] = [t78].[Id]
WHERE [m92].[Deleted] = 0
ORDER BY [t78].[Id], [t78].[Id0]
基本上,内部联接中的整个部分都存在于正在执行的所有查询中。理想情况下,我们只需要在查询中将子实体与父实体连接起来

1) 为什么EF core会转换为查询,从而在所有拆分查询中包含引用导航属性

2) 有没有办法避免这种行为,具体来说,就是用父实体替换内部连接块

1) 为什么EF core会转换为查询,从而在所有拆分查询中包含引用导航属性

这是一个实现缺陷/缺少优化

2) 有没有办法避免这种行为,具体来说,就是用父实体替换内部连接块

我找到的唯一方法是在删除集合导航属性includes(生成附加查询)的情况下具体化查询,然后手动执行查询以加载相关集合(需要跟踪查询并依赖导航属性修复)

例如(假设未标记为引用的导航属性是集合):

//仅使用筛选器进行查询
var query=\u dbContext.MyEntity
。其中(s=>s.Id==Id);
//仅使用筛选器和引用包含执行和具体化查询
var result=等待查询
.Include(s=>s.Address)//参考导航
.Include(s=>s.BuildingDetails)//参考导航
//。然后包括(s=>s.ChildOfBuildingDetails)
//.包括(s=>s.联系人)
//.包括(s=>s.技术人员)
.Include(s=>s.deactionDetails)//参考导航
.FirstOrDefaultAsync(cancellationToken);
//加载相关集合
等待查询。选择Many(s=>s.BuildingDetails.ChildOfBuildingDetails)
.LoadAsync(取消令牌);
等待查询。选择many(s=>s.ContactPersons)
.LoadAsync(取消令牌);
等待查询。选择many(s=>s.technologies)
.LoadAsync(取消令牌);
1) 为什么EF core会转换为查询,从而在所有拆分查询中包含引用导航属性

这是一个实现缺陷/缺少优化

2) 有没有办法避免这种行为,具体来说,就是用父实体替换内部连接块

我找到的唯一方法是在删除集合导航属性includes(生成附加查询)的情况下具体化查询,然后手动执行查询以加载相关集合(需要跟踪查询并依赖导航属性修复)

例如(假设未标记为引用的导航属性是集合):

//仅使用筛选器进行查询
var query=\u dbContext.MyEntity
。其中(s=>s.Id==Id);
//仅使用筛选器和引用包含执行和具体化查询
var result=等待查询
.Include(s=>s.Address)//参考导航
.Include(s=>s.BuildingDetails)//参考导航
//。然后包括(s=>s.ChildOfBuildingDetails)
//.包括(s=>s.联系人)
//.包括(s=>s.技术人员)
.Include(s=>s.deactionDetails)//参考导航
.FirstOrDefaultAsync(cancellationToken);
//加载相关集合
等待查询。选择Many(s=>s.BuildingDetails.ChildOfBuildingDetails)
.LoadAsync(取消令牌);
等待查询。选择many(s=>s.ContactPersons)
.LoadAsync(取消令牌);
等待查询。选择many(s=>s.technologies)
.LoadAsync(取消令牌);

(1)EF核心缺陷(2)否,因为3.0中的(1)(3)这将是一个单一查询,但由于数据集的笛卡尔积,速度可能会慢很多倍。@IvanStoev是的,您是对的。在升级到.NET Core 3.1时,我们经历了笛卡尔爆炸式的性能影响。在某些情况下,查询执行时间从几毫秒降至5-6分钟,因此我们不得不将EF Core降级回2.2(同时将应用程序保持在.NET Core 3.1)。(1)EF Core缺陷(2)否,因为3.0中的(1)(3)这将是一个单一查询,但由于数据集的笛卡尔积,可能会慢上几倍。@IvanStoev是的,你是对的。在升级到.NET Core 3.1时,我们经历了笛卡尔爆炸式的性能影响。在某些情况下,查询执行时间从几毫秒降至5-6分钟,因此我们不得不将EF Core降级为2.2(同时将应用程序保持在.NET Core 3.1)。