c# – 懒惰与实体框架的加载性能

前端之家收集整理的这篇文章主要介绍了c# – 懒惰与实体框架的加载性能前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
所以我在DbContext上有以下模型类:

每当我呈现LoanApplication对象的列表时,我都会这样做:

var context = new MyContext();
var applications = context.LoanApplications.Where(d => d.PropertyThatIWantToFilter = localVariable);

这返回一个IQueryable,然后我转换为一个viewmodel像我的控制器方法调用

var vm = applications.Select(d => new LoanApplicationviewmodel(d));

在LoanApplicationviewmodel构造函数内部,我接受实体对象并进行相应的映射.事实是,由于Solicitors集合是一个导航属性,因此每次实例化新的视图模型时都会调用数据库.每个应用程序的平均律师人数是两个,所以这意味着如果我提供一个列出最后10个应用程序的表,那么该应用程序正在大约到18-20次访问数据库.

我以为必须有一个更好的方式来获取这个集合,所以我改变了我的原始查询,热切地加载集合,如下所示:

var applications = context.LoanApplications.Include("Solicitors").Where...

虽然这样将数据库调用次数减少到只有一个,但是查询速度要慢得多,慢50%.

数据库托管在sql Azure上,我们实施了瞬态故障处理,但是我想减少对数据库调用数量,而不会减少响应时间性能.

这里最好的做法是什么?

解决方法

“这里最好的做法是什么?

最好的做法是

>设置!应用程序广泛!绩效目标
>配置文件,基准,并定位瓶颈
>审查和微调瓶颈,给你最好的性能赢得最少的工作. (和从我的经验90%的时间不是tsql)

现在看起来有点无关紧要,但是从这个角度来看,您在应用程序领域中哪一种加载模式是最佳的,是正确的.

没有渴望/懒惰的“最佳实践”.这就是为什么两个选项都可用.另外,如果tsql是您的瓶颈,而且渴望/懒惰之间的切换还没有达到您的性能目标,那么您需要在SSMS中下载大量其他工具,如查询分析器和查询计划分析器.

对于一些背景:

我是googling“渴望加载缓慢”来到这里.这是我的结果:

var foo = _context.Foos
    //.Include("Answers")
    //.Include("Attachments")
    .FirstOrDefault(q => q.Id == key);

渴望加载:106ms

懒惰加载:11ms 5ms 5ms

懒惰加载胜利,故事结束.

猜你在找的C#相关文章