|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
有时也搞不懂应该学那种;主要看你以后去的那个公司是使用哪种了。就像王千祥的课上说的:企业应用现在主要就三层(其实也差不多就是MVC):表示层(主要使用html写的,很简单)、业务逻辑层(主要就是应用服务器的)。最后就是数据层(其实就是学习数据库)来自博客园开辟团队开辟前列最新动静:
在EntityFramework中,假如实体A联系关系了实体B,你想在加载实体A的同时加载实体B。一般做法是在LINQ查询中利用Include()。可是,假如你在查询前提顶用到了实体B,EF会主动加载实体B,这时候Include不但是过剩的,并且还会增添分外的LEFTOUTERJOIN查询,影响功能。
请看我们在博问开辟中遭受这个成绩时的一段代码:
- //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语句:
- 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阵营的我感到万分难得。 |
|