当前位置:学习生活->编程学习 ->EF的数据查询数据查询的优化——ToList()

原创版权标志EF的数据查询数据查询的优化——ToList()

作者:阿郎  发表时间:2017/1/7 21:22:03  阅读:
[摘要] EF的优点的确很多,尤其是在推出了基于CodeFirst的编程模型之后,EF越来越受.net开发人员的喜爱,但最大的缺点就是EF的查询问题——基于延迟加载,我打算推出两篇文章来讲述如何优化EF的数据查询。
没有十全十美的技术,EF的优点的确很多,尤其是在推出了基于CodeFirst的编程模型之后,EF越来越受.net开发人员的喜爱,但最大的缺点就是EF的查询问题——基于延迟加载,我打算推出两篇文章来讲述如何优化EF的数据查询。
IQueryable和IEnumerable都是延时执行(Deferred Execution)的,而IList是即时执行(Eager Execution) IQueryable和IEnumerable在每次执行时都必须连接数据库读取,而IList读取一次后,以后各次都不需连接数据库。前两者很容易造成重复读取,性能低下,并且可能引发数据不一致性
寒假开始了,我也就开始了自己的自学之路,之前为了考试耽误了太多的时间,没有好好学程序(还好最后拿了个二等奖学金,没有辜负自己的一番苦学)。之前我就写过一篇文章EF实体框架的数据查询的学习总结  MVC架构设计之在code first模式下利用DDD中的仓库模式访问数据库在那篇文章里面我讲了一种解决方法——利用与数据表实际关联的实体类型来进行数据查询,后来应该会整理一篇文章来进行分析。下面,我们用另外一种方法来优化EF的数据查询:
首先,如果你的数据库是Express版本的,请你下载这个工具:sqlexpress profiler。对于非免费版本的数据库来讲,会自带Sql Profiler数据库查看器跟踪数据库的访问,但如果你是免费版本的SQL SERVER请下载它。

我引用的数据库是北风网数据库:Northwind,你可以去网上下载它。
先看看代码:

var data = _db.Customers.Where(cus => cus.Country == "USA");

 Console.WriteLine(data.Count());
 foreach (var d in data)
 {
 Console.WriteLine(d.Country);
 }

看看我的分析:



对于什么时候执行sql数据库查询请看这篇博文:EF使用延迟加载的本质原因   ASP.NET EF 延迟加载,导航属性延迟加载
我想这么费性能的程序是为你所不能接受的,而且,我觉得EF的延迟查询不能说是真的得按需查询数据库,假设我只要某个数据表的几个字段内容,其余的我都不要,这才是按需查询,然后在我需要的查询的时候查询数据库,这才是按需查询,因此这就需要我们在查询时给数据库传递按我们的需求的Linq语句,所以这就是我们所能做的第一种优化查询,看代码:
var data = _db.Customers.Where(cus => cus.Country == "USA").Select(m => new
 {
 id = m.CustomerID,
 name = m.ContactName,
 city = m.City,
 country = m.Country
 }).ToList();

 Console.WriteLine(data.Count());
 Console.WriteLine(data.Count());
 foreach (var d in data)
 {
 Console.WriteLine(d.country);
 }.ToList()
看看运行结果:

可以看到只查询了一次数据库,而且看看生成的sql语句:

最后总结一下,对于EF的数据查询,我们可以利用匿名方法来按照我们的需要查询,并利用tolist加载到内存中。

参考的文章:

EF 延迟加载和预先加载
EF使用延迟加载的本质原因
Linq学习(二) LinQ to Entity
LINQ(LINQ to Entities)
Entity Framework 4.1 之三 : 贪婪加载和延迟加载
ASP.NET EF 延迟加载,导航属性延迟加载
linq和EF查询的用法和区分

文章来源:C++技术网原创文章版权为网站和作者共同所有,会员文章禁止转载。非会员文章转载做好本文超链接即表示授权转载。通过文章下面的分享按钮可以自由分享所有文章。

返回顶部

在线提问
问题标题:
问题描述:(简陋的描述会导致问题被最后回答、没有针对性回答甚至无法解答。请确保问题描述的足够清楚。)

弹幕群聊(QQ群:372130111)

弹幕