我尝试使用Eager Loding获取包含许多相关实体的对象列表。最初,我的代码看起来像这样:
public IEnumerable<EcommerceProduct> GetAllProducts()
{
using (var dbContext = GetDbContext())
{
return (from products in dbContext.EcommerceProducts
select products)
.Include(x => x.ProductLocalizedStrings)
.Include(x => x.Categories)
.Include(x => x.ProductLocalizedPrices)
.Include(x => x.ProductLocalizedStocks).ToList();
}
}
然后我发现this article解释了如何通过&#34;分裂&#34;来提高性能。查询为较小的,每个包含最多2个Include():
public IEnumerable<EcommerceProduct> GetAllProducts()
{
using (var dbContext = GetDbContext())
{
var productsList = (from products in dbContext.EcommerceProducts
select products)
.Include(x => x.ProductLocalizedStrings)
.Include(x => x.Categories)
.ToList();
productsList = (from products in dbContext.EcommerceProducts
select products)
.Include(x => x.ProductLocalizedPrices)
.Include(x => x.ProductLocalizedStocks)
.ToList();
return productsList;
}
}
现在,这段代码根本没有加快我的查询速度。我基本上实现了相同的结果,加载时间非常慢。我错过了什么?
答案 0 :(得分:1)
EF使用Include生成的SQL非常糟糕,但通常服务器以正确的方式管理它 您是否知道在您的情况下,性能是否与数据库或实现过程相关?要测试它,您可以捕获第一个查询(包含所有包含的查询),然后直接在DBMS上运行它 查看您的查询可能您的上下文可能会变得很大,这对EF来说并不好(即10,000个产品,每个翻译5个,每个5个价格+每个5个股票= 150,000个条目,对于EF来说不太好)。在这种情况下,您可以尝试使用AsNoTracking(或不在此部分代码中使用EF)。