【问题标题】:How to avoid multiple queries one complex objects in EF .net core如何避免在 EF .net 核心中对一个复杂对象进行多次查询
【发布时间】:2019-07-23 21:33:11
【问题描述】:

在 .net 核心 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 查询问题:

How to avoid n+1 queries in EF Core 2.1?

【问题讨论】:

    标签: c# .net .net-core ef-core-2.2


    【解决方案1】:

    EF Core 2.1 引入了Optimization of correlated subqueries,但如链接文档中所述,您需要通过将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 查询 - 每个投影一个。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-01-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多