当包含许多相关实体时,如何提高Entity Framework 6中的性能?

时间:2015-12-18 20:12:09

标签: entity-framework entity-framework-6 eager-loading

我尝试使用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;
        }
    }

现在,这段代码根本没有加快我的查询速度。我基本上实现了相同的结果,加载时间非常慢。我错过了什么?

1 个答案:

答案 0 :(得分:1)

EF使用Include生成的SQL非常糟糕,但通常服务器以正确的方式管理它 您是否知道在您的情况下,性能是否与数据库或实现过程相关?要测试它,您可以捕获第一个查询(包含所有包含的查询),然后直接在DBMS上运行它 查看您的查询可能您的上下文可能会变得很大,这对EF来说并不好(即10,000个产品,每个翻译5个,每个5个价格+每个5个股票= 150,000个条目,对于EF来说不太好)。在这种情况下,您可以尝试使用AsNoTracking(或不在此部分代码中使用EF)。