[蛋疼]使用EF的情况下,怎么复用函数或者说数据库实例

问题描述

如下面函数看,这是第一种写法TeachEasEntitiesdb=newTeachEasEntities(Public.Dbase.DataBaseEFConn);privateIEnumerable<exam_Batch>ExamBatch_GetList(stringyearTermID,stringexamWeek,stringweekSection){stringweekSection2=weekSection;if(weekSection.Substring(1)=="1"||weekSection.Substring(1)=="3")weekSection2=(int.Parse(weekSection)+1).ToString();varquery=fromrindb.exam_Batchwherer.YearTermID==yearTermID&&r.ExamWeek==examWeek&&((r.WeekSection==weekSection&&r.WeekTime==2)||((r.WeekSection==weekSection2||r.WeekSection==weekSection)&&r.WeekTime==3))selectr;returnquery;}publicoverrideIEnumerable<View_All>ExamRoomStudent_GetRoomList(stringyearTermID,stringexamWeek,stringweekSection,stringroomID){varqueryBatch=ExamBatch_GetList(yearTermID,examWeek,weekSection);//获得学生列表varqueryStud=fromrinqueryBatchfromyindb.exam_Roomfromsindb.exam_RoomStudentfromtindb.e_Studentfromqindb.t_TeachTaskwherer.YearTermID==y.YearTermID&&r.BatchOrder==y.BatchOrder&&r.BatchFlag==(byte)ExamBatchInfo.Enum_BatchFlag.Released&&y.ExamRoomID==s.ExamRoomID&&y.YearTermID==q.YearTermID&&y.CourID==q.CourID&&y.CourOrder==q.CourOrder&&s.StudID==t.StudID&&y.RoomID==roomIDselectnew{YearTermID=y.YearTermID,CourID=y.CourID,CourOrder=y.CourOrder,CourName=q.CourName,StudName=t.StudName,ClassName=t.ClassName,StudID=t.StudID,};returnquery;}

这是第二种写法TeachEasEntitiesdb=newTeachEasEntities(Public.Dbase.DataBaseEFConn);publicoverrideIEnumerable<View_All>ExamRoomStudent_GetRoomList(stringyearTermID,stringexamWeek,stringweekSection,stringroomID){stringweekSection2=weekSection;if(weekSection.Substring(1)=="1"||weekSection.Substring(1)=="3")weekSection2=(int.Parse(weekSection)+1).ToString();varqueryBatch=fromrindb.exam_Batchwherer.YearTermID==yearTermID&&r.ExamWeek==examWeek&&((r.WeekSection==weekSection&&r.WeekTime==2)||((r.WeekSection==weekSection2||r.WeekSection==weekSection)&&r.WeekTime==3))selectr;//获得学生列表varqueryStud=fromrinqueryBatchfromyindb.exam_Roomfromsindb.exam_RoomStudentfromtindb.e_Studentfromqindb.t_TeachTaskwherer.YearTermID==y.YearTermID&&r.BatchOrder==y.BatchOrder&&r.BatchFlag==(byte)ExamBatchInfo.Enum_BatchFlag.Released&&y.ExamRoomID==s.ExamRoomID&&y.YearTermID==q.YearTermID&&y.CourID==q.CourID&&y.CourOrder==q.CourOrder&&s.StudID==t.StudID&&y.RoomID==roomIDselectnew{YearTermID=y.YearTermID,CourID=y.CourID,CourOrder=y.CourOrder,CourName=q.CourName,StudName=t.StudName,ClassName=t.ClassName,StudID=t.StudID,};returnquery;}

其实第一种写法就是将下面这段单独拿出来作为一个独立的函数stringweekSection2=weekSection;if(weekSection.Substring(1)=="1"||weekSection.Substring(1)=="3")weekSection2=(int.Parse(weekSection)+1).ToString();varqueryBatch=fromrindb.exam_Batchwherer.YearTermID==yearTermID&&r.ExamWeek==examWeek&&((r.WeekSection==weekSection&&r.WeekTime==2)||((r.WeekSection==weekSection2||r.WeekSection==weekSection)&&r.WeekTime==3))selectr;

看起来没有什么不同,但当你实际执行的时候,你会发现,第二种写法在数据库只执行了一次,而第一种写法根据你的数据量执行了N次。为了这个EF的函数复用,我已经想了很多办法了,但无论如何也没有什么好的办法。第一种方法中的函数也并没有ToList()什么的,但就是没法像第二个那样。。。。。求教啊,难道必须一个函数写一遍LINQ语句吗?没有办法复用吗?第一个独立出来的函数不是没有执行吗?为什么要这样虐待我啊。。。。。

解决方案

解决方案二:
把第一种写法的第一个函数的返回类型改为IQueryable<exam_Batch>就行了
解决方案三:
本来ObjectContext默认返回的就是IQueryable<T>这种不执行的查询但是因为你把返回类型定义为IEnumrable<T>了,而IQueryable<T>:IEnumrable<T>,导致方法上看起来,但实际运行的时候,后者是会展开枚举(执行查询)的,而前者却不会,只代表一串查询表达式
解决方案四:
返回类型为IQueryable
解决方案五:
这个反复发帖终归是不好的……
解决方案六:
引用2楼dongxinxi的回复:

本来ObjectContext默认返回的就是IQueryable<T>这种不执行的查询但是因为你把返回类型定义为IEnumrable<T>了,而IQueryable<T>:IEnumrable<T>,导致方法上看起来,但实际运行的时候,后者是会展开枚举(执行查询)的,而前者却不会,只代表一串查询表达式

谢谢,我试试。
解决方案七:
最大的原因是你为什么不用视图呢,把四个需要的条件字段放在一个视图里不就解决问题了吗。
解决方案八:
还有那TeachEasEntities最好不要声明为类变量,这个对象很大,我也没有看见你手动释放的地方,很容易产生性能问题。

时间: 2024-09-22 00:36:42

[蛋疼]使用EF的情况下,怎么复用函数或者说数据库实例的相关文章

请问在使用maven的情况下如何用tomcat插件的同一个实例跑多个工程

问题描述 比如几个web工程都需要使用8080端口,而且相互之间有调用.请问在使用maven的情况下,如何能够比较方便的实现. 问题补充:需要以 mvn tomcat:run的方式运行,主要就是为了开发. 解决方案 给pom.xml tomcat-maven-plugin 配置一个server如下<plugin><groupId>org.codehaus.mojo</groupId><artifactId>tomcat-maven-plugin</ar

EF 自关联表主键自增情况下,不能添加记录的问题,有谁解决过?

问题描述 EF 自关联表主键自增情况下,不能添加记录的问题,有谁解决过? 如题,我的系统中因为一个特定原因,需要一张自关联表(thisTable)来简化逻辑, 该表主键是自增的,结果发现无法添加记录, 错误消息:无法确定"db.thisTable"关系的主体端.添加的多个实体可能主键相同. 请问,有人解决过这个问题吗? 解决方案 自己解决了,顺便分享给大家: 在EF的设定里,自关联的表主键外键,都不能为空(为空就会破坏数据的完整性), 这在两表关联时没问题,但在自关联就有一个悖论,那就

在不熟悉C/C++情况下,hook windows事件

本文讲的是在不熟悉C/C++情况下,hook windows事件, 介绍 MSDN中对它的介绍为: WMI(Windows 管理规范)是基于Windows操作系统的管理数据和操作的基础架构.可以编写WMI脚本或应用程序来自动执行远程计算机上的管理任务,但是WMI会将管理数据提供给操作系统和产品的其他部分. 通过上述定义,我们了解到他所具有的威力,你不仅可以以管理员权限进行计划任务执行,而且最重要的是,还是通过远程执行!但是这仅是它功能的冰山一角,而且很多像CozyDuke,和DeepPanda这

.NET平台下可复用的Tcp通信层实现(续)

     上一篇主要讲到了Tcp通信层中的核心组件――Tcp组件的实现,Tcp组件是整个通信层的消息驱动源,甚至,可以将Tcp组件看作是我们整个服务器系统的消息驱动源,消息处理过程从这里引发.类似的消息驱动源还有发布的WebService接口.Remoting接口等.今天我们需要关注的是Tcp通信层中的"中央"组件――消息分派器组件ITcpReqStreamDispatcher,大家已经从前文的组件关系图中看到了消息分派器的大致位置和作用了,它是Tcp通信组件和消息处理器之间的&quo

在不操作窗口的情况下触发resize事件

问题描述 在不操作窗口的情况下触发resize事件 function classJudegSize1() { var reallySize=parseInt($(".img_box")[1].naturalWidth); $(window).on("resize", function () { var img_box=parseInt($(".img_box:eq(1)").css("width")) ; var mainWa

php- js在不跳转的情况下向一个页面传递参数

问题描述 js在不跳转的情况下向一个页面传递参数 需求是把textarea传递到savexml.php进行数据保存,但同时我希望页面还留着当前页面.代码如下: <form name=""form1"" id=""form1"" method=""post"" action=""newtest.php""> <input type=

att-ATT7022电能的读取,在没有加信号的情况下也能读到数值

问题描述 ATT7022电能的读取,在没有加信号的情况下也能读到数值 ATT7022电能的读取,在没有加信号的情况下也能读到数值,而且读的数值比加信号时的还要大

请问xamarin种,如何打开数据链接(如果检测到没有网络的情况下)

问题描述 请问xamarin种,如何打开数据链接(如果检测到没有网络的情况下) 请问xamarin种,如何打开数据链接(如果检测到没有网络的情况下)thank in advance 解决方案 https://msdn.microsoft.com/zh-cn/magazine/mt147239.aspx

在什么情况下命令【mv item.1 item.2】能够移动整个子目录树

问题描述 在什么情况下命令[mv item.1 item.2]能够移动整个子目录树 题目:如果item.1和 item.2已经存在,在什么情况下命令 mv item.1 item.2能够移动整个子目录树? A.item.1和item.2是现有子目录 B.只有使用特殊命令选项时C.只有在item.2是空的时候D.只有在item.1是空的时候 在网上找的答案是选:A,我有些疑惑. 我所理解的移动整个子目录树的意思是:将item.1中的文件和目录全部移动到item.2中,而不是把item.1这个目录移