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

yixian2007 2016-01-21 03:38:19
如下面函数看,这是第一种写法

TeachEasEntities db = new TeachEasEntities(Public.Dbase.DataBaseEFConn);
private IEnumerable<exam_Batch> ExamBatch_GetList(string yearTermID, string examWeek, string weekSection)
{
string weekSection2 = weekSection;
if (weekSection.Substring(1) == "1" || weekSection.Substring(1) == "3")
weekSection2 = (int.Parse(weekSection) + 1).ToString();
var query = from r in db.exam_Batch
where r.YearTermID == yearTermID && r.ExamWeek == examWeek && ((r.WeekSection == weekSection && r.WeekTime == 2) || ((r.WeekSection == weekSection2 || r.WeekSection == weekSection) && r.WeekTime == 3))
select r;
return query;
}
public override IEnumerable<View_All> ExamRoomStudent_GetRoomList(string yearTermID, string examWeek, string weekSection, string roomID)
{
var queryBatch = ExamBatch_GetList(yearTermID, examWeek, weekSection);
//获得学生列表
var queryStud = from r in queryBatch
from y in db.exam_Room
from s in db.exam_RoomStudent
from t in db.e_Student
from q in db.t_TeachTask
where r.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 == roomID
select new {
YearTermID = y.YearTermID,
CourID = y.CourID,
CourOrder = y.CourOrder,
CourName = q.CourName,
StudName = t.StudName,
ClassName = t.ClassName,
StudID = t.StudID,
};

return query;
}

这是第二种写法

TeachEasEntities db = new TeachEasEntities(Public.Dbase.DataBaseEFConn);
public override IEnumerable<View_All> ExamRoomStudent_GetRoomList(string yearTermID, string examWeek, string weekSection, string roomID)
{
string weekSection2 = weekSection;
if (weekSection.Substring(1) == "1" || weekSection.Substring(1) == "3")
weekSection2 = (int.Parse(weekSection) + 1).ToString();
var queryBatch = from r in db.exam_Batch
where r.YearTermID == yearTermID && r.ExamWeek == examWeek && ((r.WeekSection == weekSection && r.WeekTime == 2) || ((r.WeekSection == weekSection2 || r.WeekSection == weekSection) && r.WeekTime == 3))
select r;

//获得学生列表
var queryStud = from r in queryBatch
from y in db.exam_Room
from s in db.exam_RoomStudent
from t in db.e_Student
from q in db.t_TeachTask
where r.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 == roomID
select new {
YearTermID = y.YearTermID,
CourID = y.CourID,
CourOrder = y.CourOrder,
CourName = q.CourName,
StudName = t.StudName,
ClassName = t.ClassName,
StudID = t.StudID,
};

return query;
}

其实第一种写法就是将下面这段单独拿出来作为一个独立的函数

string weekSection2 = weekSection;
if (weekSection.Substring(1) == "1" || weekSection.Substring(1) == "3")
weekSection2 = (int.Parse(weekSection) + 1).ToString();
var queryBatch = from r in db.exam_Batch
where r.YearTermID == yearTermID && r.ExamWeek == examWeek && ((r.WeekSection == weekSection && r.WeekTime == 2) || ((r.WeekSection == weekSection2 || r.WeekSection == weekSection) && r.WeekTime == 3))
select r;


看起来没有什么不同,但当你实际执行的时候,你会发现,第二种写法在数据库只执行了一次,而第一种写法根据你的数据量执行了N次。

为了这个EF的函数复用,我已经想了很多办法了,但无论如何也没有什么好的办法。第一种方法中的函数也并没有ToList()什么的,但就是没法像第二个那样。。。。。

求教啊,难道必须一个函数写一遍LINQ语句吗?没有办法复用吗?第一个独立出来的函数不是没有执行吗?为什么要这样虐待我啊。。。。。
...全文
158 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
wq1234wq 2016-01-21
  • 打赏
  • 举报
回复
还有那TeachEasEntities 最好不要声明为类变量,这个对象很大,我也没有看见你手动释放的地方,很容易产生性能问题。
wq1234wq 2016-01-21
  • 打赏
  • 举报
回复
最大的原因是你为什么不用视图呢,把四个需要的条件字段放在一个视图里不就解决问题了吗。
yixian2007 2016-01-21
  • 打赏
  • 举报
回复
引用 2 楼 dongxinxi 的回复:
本来ObjectContext默认返回的就是IQueryable<T>这种不执行的查询 但是因为你把返回类型定义为IEnumrable<T>了,而IQueryable<T>: IEnumrable<T>,导致方法上看起来,但实际运行的时候,后者是会展开枚举(执行查询)的,而前者却不会,只代表一串查询表达式
谢谢,我试试。
  • 打赏
  • 举报
回复
这个反复发帖终归是不好的……
凤凰涅檠 2016-01-21
  • 打赏
  • 举报
回复
返回类型为IQueryable
  • 打赏
  • 举报
回复
本来ObjectContext默认返回的就是IQueryable<T>这种不执行的查询 但是因为你把返回类型定义为IEnumrable<T>了,而IQueryable<T>: IEnumrable<T>,导致方法上看起来,但实际运行的时候,后者是会展开枚举(执行查询)的,而前者却不会,只代表一串查询表达式
  • 打赏
  • 举报
回复
把第一种写法的第一个函数的返回类型改为IQueryable<exam_Batch>就行了

110,567

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧