为了账号安全,请及时绑定邮箱和手机立即绑定

Linq 请求对 DB 进行大量查询

Linq 请求对 DB 进行大量查询

C#
烙印99 2021-11-14 15:49:51
我有这样的 ef 类:class Product {  public int ProductId {set; get;}... public List<ProductBannedIn> BannedIn;}public class ProductBannedIn{  public int ProductId {set; get;}  public Product Product {set; get;}  public int CountryId {set; get;}  public Country Country {set; get;}}并想提出如下请求:... //query - added some filters beforevar products = query.Include(x => x.BannedIn)    .Join(context.ProductTranslation        .Where(x => x.LanguageId == language.LanguageId),           product => product.ProductId,              translation => translation.Product.ProductId,                  (x,y) => new {                      Id = x. ProductId,                      Name = y.Name,                      Description = y.Description,                      Type = x.TypeId,                      BannedIn = x.BannedIn.Select(b => b.CountryId),                   }).ToList();问题:问题是当我获取例如 1000 件产品时BannedIn = x.BannedIn.Select(b => b.CountryId)对每一行进行查询,而且速度很慢。我在调试器中看到的,对于每个产品进行查询以获取 BannedIn,但应该已经获取,因为我有 Include需要实现的目标:通常应该像 1 个查询 db 而不是每行 (x.BannedIn)
查看完整描述

2 回答

?
跃然一笑

TA贡献1826条经验 获得超6个赞

这是 2.1 EF Core 之前版本中相关子查询的已知(所谓的 N + 1 查询)问题。它已在 2.1 中修复 - 请参阅EF Core 2.1 中的新功能-相关子查询的优化

我们改进了我们的查询转换,以避免在许多常见场景中执行“N + 1”SQL 查询,在这些场景中,在投影中使用导航属性导致将来自根查询的数据与来自相关子查询的数据连接起来。优化需要缓冲子查询的结果,我们要求您修改查询以选择加入新行为。

因此,如果可能,请升级到最新的 EF Core 位,然后通过添加.ToList()到相关子查询来“选择加入”进行优化,如文档链接中所述:

BannedIn = x.BannedIn.Select(b => b.CountryId).ToList(),

结果将是执行 2 个 SQL 查询(这就是 EF Core 处理相关集合的方式 - 每个集合 1 个 SQL 查询),但不是目前每个产品 1 个。


查看完整回答
反对 回复 2021-11-14
?
元芳怎么了

TA贡献1798条经验 获得超7个赞

我刚刚更新了 ef 包,一切正常


查看完整回答
反对 回复 2021-11-14
  • 2 回答
  • 0 关注
  • 195 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信