仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1013|回复: 8
打印 上一主题 下一主题

[学习教程] ASP.NET网页设计Entity Framework 利用注重:Where查询前提顶用到的联系关系实体不必要Include仓酷云 ...

[复制链接]
兰色精灵 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:16:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
有时也搞不懂应该学那种;主要看你以后去的那个公司是使用哪种了。就像王千祥的课上说的:企业应用现在主要就三层(其实也差不多就是MVC):表示层(主要使用html写的,很简单)、业务逻辑层(主要就是应用服务器的)。最后就是数据层(其实就是学习数据库)来自博客园开辟团队开辟前列最新动静:
在EntityFramework中,假如实体A联系关系了实体B,你想在加载实体A的同时加载实体B。一般做法是在LINQ查询中利用Include()。可是,假如你在查询前提顶用到了实体B,EF会主动加载实体B,这时候Include不但是过剩的,并且还会增添分外的LEFTOUTERJOIN查询,影响功能。
请看我们在博问开辟中遭受这个成绩时的一段代码:

  1. //Forq.cnblogs.compublicclassQuestionService{privateIRepository<QuestionItem>_questionRepository;publicQuestionService(IUnitOfWorkunitOfWork):base(unitOfWork){_questionRepository=newRepository<QuestionItem>(unitOfWork);}publicList<QuestionItem>GetUnsolvedQuestions(intpageIndex,intpageSize){return_questionRepository.Entities.Include(q=>q.User).Where(q=>q.IsActive&&q.User.IsActive).Skip((pageIndex-1)*pageSize).Take(pageSize).ToList();}}publicclassQuestionItem{publicintId{get;set;}publicstringTitle{get;set;}publicboolIsActive{get;set;}publicintUserId{get;set;}publicUserUser{get;set;}}publicclassUser{publicintUserId{get;set;}publicboolIsActive{get;set;}}
复制代码


在下面的代码中,我们想在GetActiveQuestions()前往List<QuestionItem>时,QuestionItem中要包括User信息,以是在LINQ查询利用了.Include(q=>q.User)。
(出格要注重的是:这里把q.User.IsActive作为查询前提之一)
然后我们用SQLServerProfiler发明,EntityFramework天生了以下的SQL语句:

  1. SELECTTOP(25)[Filter1].[Id]AS[Id],[Filter1].[Title]AS[Title],[Filter1].[UserId]AS[UserId],[Filter1].[UserId1]AS[UserId1],[Filter1].[IsActive1]AS[IsActive],[Filter1].[UserId2]AS[UserId1],[Filter1].[IsActive2]AS[IsActive1]FROM(SELECT[Extent1].[Id]AS[Id],[Extent1].[Title]AS[Title],[Extent1].[UserId]AS[UserId1],[Extent1].[IsActive]AS[IsActive1],[Extent3].[UserID]AS[UserID2],[Extent3].[IsActive]AS[IsActive2],row_number()OVER(ORDERBY[Extent1].[QID]DESC)AS[row_number]FROM[dbo].[question_Item]AS[Extent1]INNERJOIN[dbo].[Users]AS[Extent2]ON[Extent1].[UserID]=[Extent2].[UserID]LEFTOUTERJOIN[dbo].[Users]AS[Extent3]ON[Extent1].[UserID]=[Extent3].[UserID]WHERE([Extent1].[IsActive]=1)AND([Extent2].[IsActive]=1))AS[Filter1]WHERE[Filter1].[row_number]>0ORDERBY[Filter1].[Id]DESC
复制代码


[dbo].[Users]表对应的就是User实体类,下面的SQL中[dbo].[Users]呈现了两次JOIN,因为[Users]表数据量对照年夜,两次JOIN影响了实行企图,查询耗时增添。这明显是要制止的。
在与这个成绩一阵苦战以后,我们终究找到办理办法——往失落Include,就这么复杂!
从这个中央看,EntityFramework仍是挺伶俐的,可是因为不晓得它的这个伶俐的地方,反而带来了成绩。
以是,代码如人,要和她相处好,就要懂得她的统统!
既然话题已经抄起,我打算今晚发篇博文再引导一下舆论方向,使它再火两天,抛砖引玉,而且赵劼先生一直在跟帖,使.NET阵营的我感到万分难得。
乐观 该用户已被删除
沙发
发表于 2015-1-19 11:47:57 | 只看该作者
在一个项目中谁敢保证每天几千万甚至几亿条的数据不丢失?谁敢保证应用的高可靠性?有可以借签的项目吗?
灵魂腐蚀 该用户已被删除
板凳
发表于 2015-1-24 12:37:36 | 只看该作者
可以通过在现有ASP应用程序中逐渐添加ASP.NET功能,随时增强ASP应用程序的功能。ASP.NET是一个已编译的、基于.NET的环境,可以用任何与.NET兼容的语言(包括VisualBasic.NET、C#和JScript.NET.)创作应用程序。另外,任何ASP.NET应用程序都可以使用整个.NETFramework。开发人员可以方便地获得这些技术的优点,其中包括托管的公共语言运行库环境、类型安全、继承等等。
再现理想 该用户已被删除
地板
发表于 2015-1-29 09:33:33 | 只看该作者
可以通过在现有ASP应用程序中逐渐添加ASP.NET功能,随时增强ASP应用程序的功能。ASP.NET是一个已编译的、基于.NET的环境,可以用任何与.NET兼容的语言(包括VisualBasic.NET、C#和JScript.NET.)创作应用程序。另外,任何ASP.NET应用程序都可以使用整个.NETFramework。开发人员可以方便地获得这些技术的优点,其中包括托管的公共语言运行库环境、类型安全、继承等等。
爱飞 该用户已被删除
5#
发表于 2015-2-5 14:55:07 | 只看该作者
ASP.NET可以无缝地与WYSIWYGHTML编辑器和其他编程工具(包括MicrosoftVisualStudio.NET)一起工作。这不仅使得Web开发更加方便,而且还能提供这些工具必须提供的所有优点,包括开发人员可以用来将服务器控件拖放到Web页的GUI和完全集成的调试支持。微软为ASP.net设计了这样一些策略:易于写出结构清晰的代码、代码易于重用和共享、可用编译类语言编写等等,目的是让程序员更容易开发出Web应用,满足计算向Web转移的战略需要。
冷月葬花魂 该用户已被删除
6#
发表于 2015-2-11 12:50:22 | 只看该作者
由于CGI程序每响应一个客户就会打开一个新的进程,所以,当有多个用户同时进行CGI请求的时候,服务器就会打开多个进程,这样就加重了服务器的负担,使服务器的执行效率变得越来越低下。
分手快乐 该用户已被删除
7#
发表于 2015-2-28 16:40:35 | 只看该作者
在一个项目中谁敢保证每天几千万甚至几亿条的数据不丢失?谁敢保证应用的高可靠性?有可以借签的项目吗?
8#
发表于 2015-3-2 22:22:42 | 只看该作者
Servlet却在响应第一个请求的时候被载入,一旦Servlet被载入,便处于已执行状态。对于以后其他用户的请求,它并不打开进程,而是打开一个线程(Thread),将结果发送给客户。由于线程与线程之间可以通过生成自己的父线程(ParentThread)来实现资源共享,这样就减轻了服务器的负担,所以,JavaServlet可以用来做大规模的应用服务。
再见西城 该用户已被删除
9#
发表于 2015-3-25 04:30:31 | 只看该作者
是指转换后的Servlet程序代码的行数。这给调试代码带来一定困难。所以,在排除错误时,可以采取分段排除的方法(在可能出错的代码前后输出一些字符串,用字符串是否被输出来确定代码段从哪里开始出错)。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-23 04:08

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表