[英]Linq request make a lot of queries to 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条查询,而不是对每一行(x.BannedIn)
在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个。
我刚刚更新了ef软件包,并且一切正常
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.