Linq 请求对 DB 进行大量查询

我有这样的 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 before

var 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)


烙印99
浏览 196回答 2
2回答

跃然一笑

这是 2.1 EF Core 之前版本中相关子查询的已知(所谓的 N + 1 查询)问题。它已在 2.1 中修复 - 请参阅EF Core 2.1 中的新功能-相关子查询的优化:我们改进了我们的查询转换,以避免在许多常见场景中执行“N + 1”SQL 查询,在这些场景中,在投影中使用导航属性导致将来自根查询的数据与来自相关子查询的数据连接起来。优化需要缓冲子查询的结果,我们要求您修改查询以选择加入新行为。因此,如果可能,请升级到最新的 EF Core 位,然后通过添加.ToList()到相关子查询来“选择加入”进行优化,如文档链接中所述:BannedIn&nbsp;=&nbsp;x.BannedIn.Select(b&nbsp;=>&nbsp;b.CountryId).ToList(),结果将是执行 2 个 SQL 查询(这就是 EF Core 处理相关集合的方式 - 每个集合 1 个 SQL 查询),但不是目前每个产品 1 个。

元芳怎么了

我刚刚更新了 ef 包,一切正常
打开App,查看更多内容
随时随地看视频慕课网APP