当前位置:  开发笔记 > 编程语言 > 正文

当生成的查询只需要1/2秒时,为什么Entity Framework需要30秒才能加载记录?

如何解决《当生成的查询只需要1/2秒时,为什么EntityFramework需要30秒才能加载记录?》经验,为你挑选了1个好方法。



1> Chris Dutrow..:

我有同样的问题,我的查询需要40秒.

我发现问题出在.Include("table_name")功能上.我拥有的越多,它就越糟糕.相反,我在查询后立即将我的代码更改为Lazy Load所需的所有数据,这将总时间从40秒减少到大约1.5秒.据我所知,这完成了同样的事情.

所以对于你的代码,它将是这样的:

var groupQuery = (from g in context.Groups
            where g.GroupKey == 6 
            select g).OfType(); 

var groups = groupQuery.ToList();

foreach (var g in groups)
{
    // Assuming Dealcontract is an Object, not a Collection of Objects
    g.DealContractReference.Load();
    if (g.DealContract != null)
    {
        foreach (var d in g.DealContract)
        {
            // If the Reference is to a collection, you can just to a Straight ".Load"
            //  if it is an object, you call ".Load" on the refence instead like with "g.DealContractReference" above
            d.Contracts.Load();
            foreach (var c in d.Contracts)
            {
                c.AdvertiserAccountType1Reference.Load();
                // etc....
            }
        }
    }
}

顺便提一下,如果你要在当前代码中将这行代码添加到查询之上,它会将时间缩短到大约4-5秒(在我的选项中仍然过于敏感)从我的理解,该MergeOption.NoTracking选项禁用了很多用于更新和插入数据库的跟踪开销:

context.groups.MergeOption = MergeOption.NoTracking;


这看起来非常直观.发出多个SQL请求并加载相同数量的对象比发出一个sql请求更快?
推荐阅读
殉情放开那只小兔子
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有