关于EF查询的性能
现象:前台grid发送ajax请求,通过谷歌devtool发现“waiting”时间高达23s(1500条数据);可见服务器端代码处理花费时间很长;
解决:分析代码,有两处代码注释掉后速度提升明显
1 //第一处,查询所有考试成绩:1500条 2 var data = _scoreResultService.GetAllKenScoreResults().ToList(); 3 //去掉ToList()后查询时间减少明显(3s); 4 5 //第二处; 6 foreach (var item in data) 7 { 8 KenScoreResultModel model = new KenScoreResultModel(); 9 model = item.ToModel(); 10 //var cus = _customerService.GetCustomerById(item.CustomerId); 11 //model.CustomerName = cus == null ? "未知用户名" : cus.GetFullName(); 12 model.CustomerName = item.Customer.GetFullName(); 13 14 //修改后的代码 使用导航属性 修改后waiting时间大幅下降(降低到769ms) 15 var course = _courseService.GetKenCourseById(item.CourseId); 16 17 18 list.Add(model); 19 }
原因:前后查询时间差距有30倍之多……还没时间深究:1、第一种情况应该是EF延迟加载问题;2、第二种情况,如果不使用导航属性,一个成绩对应一名用户,1500条考试成绩,用户名查询查库就进行1500次,因此效率低,而使用导航属性在成绩查询时,已经包含了用户数据,因此不需要继续查库,不知道是否可以这样理解?有时间看看EF代码……