仓酷云

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

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

ASP.NET网页设计Entity Framework 利用注重:Where查询前提顶用到的联系关系实体不必要Include仓酷云 ...
登录/注册后可看大图
  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
在一个项目中谁敢保证每天几千万甚至几亿条的数据不丢失?谁敢保证应用的高可靠性?有可以借签的项目吗?
作者: 灵魂腐蚀    时间: 2015-1-24 12:37
可以通过在现有ASP应用程序中逐渐添加ASP.NET功能,随时增强ASP应用程序的功能。ASP.NET是一个已编译的、基于.NET的环境,可以用任何与.NET兼容的语言(包括VisualBasic.NET、C#和JScript.NET.)创作应用程序。另外,任何ASP.NET应用程序都可以使用整个.NETFramework。开发人员可以方便地获得这些技术的优点,其中包括托管的公共语言运行库环境、类型安全、继承等等。
作者: 再现理想    时间: 2015-1-29 09:33
可以通过在现有ASP应用程序中逐渐添加ASP.NET功能,随时增强ASP应用程序的功能。ASP.NET是一个已编译的、基于.NET的环境,可以用任何与.NET兼容的语言(包括VisualBasic.NET、C#和JScript.NET.)创作应用程序。另外,任何ASP.NET应用程序都可以使用整个.NETFramework。开发人员可以方便地获得这些技术的优点,其中包括托管的公共语言运行库环境、类型安全、继承等等。
作者: 爱飞    时间: 2015-2-5 14:55
ASP.NET可以无缝地与WYSIWYGHTML编辑器和其他编程工具(包括MicrosoftVisualStudio.NET)一起工作。这不仅使得Web开发更加方便,而且还能提供这些工具必须提供的所有优点,包括开发人员可以用来将服务器控件拖放到Web页的GUI和完全集成的调试支持。微软为ASP.net设计了这样一些策略:易于写出结构清晰的代码、代码易于重用和共享、可用编译类语言编写等等,目的是让程序员更容易开发出Web应用,满足计算向Web转移的战略需要。
作者: 冷月葬花魂    时间: 2015-2-11 12:50
由于CGI程序每响应一个客户就会打开一个新的进程,所以,当有多个用户同时进行CGI请求的时候,服务器就会打开多个进程,这样就加重了服务器的负担,使服务器的执行效率变得越来越低下。
作者: 分手快乐    时间: 2015-2-28 16:40
在一个项目中谁敢保证每天几千万甚至几亿条的数据不丢失?谁敢保证应用的高可靠性?有可以借签的项目吗?
作者: 仓酷云    时间: 2015-3-2 22:22
Servlet却在响应第一个请求的时候被载入,一旦Servlet被载入,便处于已执行状态。对于以后其他用户的请求,它并不打开进程,而是打开一个线程(Thread),将结果发送给客户。由于线程与线程之间可以通过生成自己的父线程(ParentThread)来实现资源共享,这样就减轻了服务器的负担,所以,JavaServlet可以用来做大规模的应用服务。
作者: 再见西城    时间: 2015-3-25 04:30
是指转换后的Servlet程序代码的行数。这给调试代码带来一定困难。所以,在排除错误时,可以采取分段排除的方法(在可能出错的代码前后输出一些字符串,用字符串是否被输出来确定代码段从哪里开始出错)。




欢迎光临 仓酷云 (http://ckuyun.com/) Powered by Discuz! X3.2