【今日/总数】文章:2/2773 用户:4/10747 书籍:0/200
回顾2016,喜迎2017,以“回顾我与C++技术网的2016,展望C++技术网的2017”为主题,发表文章,将有机会赢得2个月的会员或现金红包。

原创版权标志如何优化EF的数据查询——延迟加载的优点与弊端的解决方法1

作者:阿郎  发表时间:2017/1/7 21:22:03  阅读:104
[摘要]EF的优点的确很多,尤其是在推出了基于CodeFirst的编程模型之后,EF越来越受.net开发人员的喜爱,但最大的缺点就是EF的查询问题——基于延迟加载,我打算推出两篇文章来讲述如何优化EF的数据查询。
文章来源:C++技术网 原创文章版权所有,未经授权,禁止转载。
没有十全十美的技术,EF的优点的确很多,尤其是在推出了基于CodeFirst的编程模型之后,EF越来越受.net开发人员的喜爱,但最大的缺点就是EF的查询问题——基于延迟加载,我打算推出两篇文章来讲述如何优化EF的数据查询。

寒假开始了,我也就开始了自己的自学之路,之前为了考试耽误了太多的时间,没有好好学程序(还好最后拿了个二等奖学金,没有辜负自己的一番苦学)。之前我就写过一篇文章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
                                            });

            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群 广告服务 增值服务 捐款资助 版权声明 RSS订阅 站点地图 百度网站地图 意见反馈
鄂ICP备14001349号-2, Copyright © 2014-2017, CJJJS.COM/CJJJS.CN, All Rights Reserved

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