我有这样的 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 个。
- 2 回答
- 0 关注
- 195 浏览
添加回答
举报
0/150
提交
取消