所以我在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
懒惰加载胜利,故事结束.