如何避免在 EF .net 核心中多次查询一个复杂对象
How to avoid multiple queries one complex objects in EF .net core
在 .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 */ })
})
}
我想 return 将数据放入投影中,但是对于 B 类的每个对象都进行查询以获取 C 类对象,另一个查询以获取 D 类对象。我该如何避免这种情况行为?
这是这个问题中解决的典型 N+1 查询问题:
How to avoid n+1 queries in EF Core 2.1?
EF Core 2.1 引入了 Optimization of correlated subqueries,但如链接文档中所述,您需要通过添加 ToList()
opt-in ] 所有 collection 预测。
尽可能使用导航属性而不是手动连接。
例如
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 个查询 - 每个投影一个。
在 .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 */ })
})
}
我想 return 将数据放入投影中,但是对于 B 类的每个对象都进行查询以获取 C 类对象,另一个查询以获取 D 类对象。我该如何避免这种情况行为?
这是这个问题中解决的典型 N+1 查询问题:
How to avoid n+1 queries in EF Core 2.1?
EF Core 2.1 引入了 Optimization of correlated subqueries,但如链接文档中所述,您需要通过添加 ToList()
opt-in ] 所有 collection 预测。
尽可能使用导航属性而不是手动连接。
例如
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 个查询 - 每个投影一个。