问题描述
一段程序如下,这是第一个疑惑,objectqueryIQueryable到底有什么区别TeachEasEntitiesdb=newTeachEasEntities(Public.Dbase.DataBaseEFConn);publicoverrideIList<View_All>ExamRoom_GetViewListByCourOrder(stringyearTermID,stringcourID,stringcourOrder){byteflag=(byte)ExamBatchInfo.Enum_BatchFlag.Released;shortshortCourOrder=short.Parse(courOrder);varquery=fromrindb.exam_Batchfromyindb.exam_Roomwherer.YearTermID==y.YearTermID&&r.CourID==y.CourID&&r.BatchOrder==y.BatchOrder&&r.BatchFlag==flag&&y.YearTermID==yearTermID&&y.CourID==courID&&y.CourOrder==shortCourOrderselectnewView_All{ExamBatch_WeekSection=r.WeekSection,ExamBatch_ExamDate=r.ExamDate,ExamBatch_TimeExplain=r.TimeExplain,ExamRoom_RoomID=y.RoomID,ExamRoom_RoomNumber=y.RoomNumber??0,};returnquery.ToList();}
这段程序没有问题,可以执行,但如果这样写,将程序分隔到不同的类中,就无法通过编译publicclassDataBaseControl{TeachEasEntitiesdb=newTeachEasEntities(Public.Dbase.DataBaseEFConn);publicIQueryable<exam_Batch>ExamBatch_GetList(){db.Refresh(System.Data.Objects.RefreshMode.StoreWins,db.exam_Batch);returndb.exam_Batch;}publicIQueryable<exam_Room>ExamRoom_GetList(){returndb.exam_Room;}}publicoverrideIList<View_All>ExamRoom_GetViewListByCourOrder(stringyearTermID,stringcourID,stringcourOrder){byteflag=(byte)ExamBatchInfo.Enum_BatchFlag.Released;shortshortCourOrder=short.Parse(courOrder);varquery=fromrinExamBatch_GetList()fromyinExamRoom_GetList()wherer.YearTermID==y.YearTermID&&r.CourID==y.CourID&&r.BatchOrder==y.BatchOrder&&r.BatchFlag==flag&&y.YearTermID==yearTermID&&y.CourID==courID&&y.CourOrder==shortCourOrderselectnewView_All{ExamBatch_WeekSection=r.WeekSection,ExamBatch_ExamDate=r.ExamDate,ExamBatch_TimeExplain=r.TimeExplain,ExamRoom_RoomID=y.RoomID,ExamRoom_RoomNumber=y.RoomNumber??0,};returnquery.ToList();}
如果改成这样,上述函数中会提示出错,说什么类型不对,我就不是很明白,db.exam_Batch出来的类型是objectquery,ExamBatch_GetList()函数出来的是IQueryable,到底有多少区别?IQueryable使用上,一旦出现需要NEW的地方就会出错,必须将其AsEnumerable(),这个时候使用NEW的时候就是正常的。无法理解,测试多次也还是同样的问题,同样的,如果AsEnumerable(),又会出现多次访问数据库的问题,在SQL的监测中,有些语句要执行很多遍,就是因为IEnumerable()类型。说起来,只是将这个程序分成两层,就变成这样了,到底是为什么呢?
解决方案
解决方案二:
改写后,override用法就不对,它是覆盖父类中abstract或virtual方法的,你这里根本就没有父类而第一段代码里,估计是一个派生类中的代码
解决方案三:
引用1楼From_TaiWan的回复:
改写后,override用法就不对,它是覆盖父类中abstract或virtual方法的,你这里根本就没有父类而第一段代码里,估计是一个派生类中的代码
好吧,我不得不解释下!这里就是覆盖父类中的方法的,我只是把我程序中的一段粘了过来而已,请不要在意这些!
解决方案四:
我这里想表达的是IQueryable类型的查询和objectquery区别很大。直接db.exam_Batch出来的是objectquery,但加上Where子句后变成IQueryable类型,但如果将其分解成下一层的方法,则其结果不是直接产生SQL语句。