如何在EF .net core中避免对复杂对象进行多次查询

3
在 .net core 2.2 中,我有一个像这样的模型:
public class A
{
  public ICollection<B> B { get; set; }
}

public class B 
{
  public ICollection<C> C { get; set; }
  public ICollection<D> D { get; set; }
}

public class C
{

}

public class D
{

}

查询内容大致如下:

var query = from record in Set<A>()
            where record.Id == Id
select new AProjection
{
    BProjection =( from bRecord in Set<B>() 
                    where bRecord.Id = record.BId
    select new BProjection 
    {
        CProjection = bRecord.C.Select( b => new CProjection {/* data here */ }),
        DProjection = bRecord.C.Select( b => new DProjection {/* data here */ })
    })
}

我希望将数据返回到一个投影中,但对于每个类型B的对象,都需要进行一次查询以获取类型C的对象,并且还需要进行另一次查询以获取类型D的对象。我该如何避免这种行为?
这是一个典型的N+1查询问题,在这个问题中得到了解决: 如何在EF Core 2.1中避免n+1查询?
1个回答

1

EF Core 2.1引入了关联子查询的优化,但正如链接文档中所提到的,您需要通过在所有集合投影中添加ToList()来选择使用它。

此外,在可能的情况下,请使用导航属性而不是手动连接。

例如:

var query =
    from a in db.Set<A>()
    select new AProjection
    {
        B = (from b in a.B
             select new BProjection
             {
                 C = (from c in b.C select new CProjection { ... }).ToList(), // <--
                 D = (from d in b.D select new DProjection { ... }).ToList(), // <--
             }).ToList() // <--
    };

这将执行总共4个SQL查询 - 每个投影一个。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接