EF是否自动加载许多参考集合

问题描述 投票:1回答:1

想象我们有以下数据库结构

 Organization 
 {
    Guid OrganizationId
    //....
 }

 User 
 {
    Guid UserId
 }

 OrganizationUsers
 {
     Guid OrganizationId
     Guid UserId 
 }

当edmx生成此类时,它将OrganizationUsers抽象化为多对多引用。因此将不会为其生成POCO类。

说我正在从上下文中加载数据,但是为了避免笛卡尔生产,我不使用包含项,而是进行两个单独的查询。

using(var context = new EntitiesContext())
{
    var organizationsQuery =  context.Where(FilterByParent);
    var organizations = organizationsQuery.ToList();
    var users = organizationsQuery.SelectMany(x => x.Users).Load();
}

假设连接的实体已加载是安全的吗?如果我直接从DBSet加载用户,这会有所不同吗?

c# entity-framework-5 cartesian-product
1个回答
0
投票

假定连接的实体已加载是否安全?

是的,很安全,因为首先由organizations跟踪EF Change Tracker,然后在下一条语句中调用Load,EF知道结果应该附加到跟踪的实体上

如果我直接从DBSet加载用户,这会有什么区别吗?

实际上以这种方式使用Load并没有比Include更好!

[如果您使用Include EF将其转换为LEFT JOIN,如果您使用Load它将被转换为INNER JOIN,并且如果您使用Contains方法通过用户的ID直接获取用户,它将被转换为IN在Sql端。在LoadContains情况下,您在Sql上执行了两个查询(两次通过),但是在Include情况下,它一次执行了,因此总体而言,它的性能优于您的方法。

您可以使用Sql Profiler工具自己比较这些方法。

© www.soinside.com 2019 - 2024. All rights reserved.