EF架构~为导航属性赋值时ToList()的替换方案
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
EF架构~为导航属性赋值时ToList()的替换⽅案
今天在进⾏EF开发时,遇到⼀个问题,在进⾏join查询时,类中的⼀个集合类型的导航属性,在给它赋值时,将查询出来的结果ToList()后,出错了,linq to entity不⽀持这种操作,⽽在linq to sql⾥这是合法的,在EF中是不⾏的,所以,使⽤了替换⽅法,就是类型强转,代码如下:
var linq = from student in base.GetModel()
join user_classrooms in new TsingDa_NewLearningBarRepository<User_Classroom_R>(base.UnitWork).GetModel()
on erInfoID equals user_erInfoID
join classroom_Info in new TsingDa_NewLearningBarRepository<Classroom_Info>(base.UnitWork).GetModel()
on user_classrooms.ClassroomInfoID equals classroom_Info.ClassroomInfoID
join teacher in base.GetModel()
on classroom_erInfoID equals erInfoID
join classroom_Plan in new TsingDa_NewLearningBarRepository<Classroom_Plan>(base.UnitWork).GetModel()
on user_classrooms.ClassroomInfoID equals classroom_Plan.ClassroomInfoID into list
join classroom_CommonValue_R in new TsingDa_NewLearningBarRepository<Classroom_CommonValue_R>(base.UnitWork).GetModel() on user_classrooms.ClassroomInfoID equals classroom_CommonValue_R.ClassroomInfoID into valueList
join user_ClassroomPlan_Study in new TsingDa_NewLearningBarRepository<User_ClassroomPlan_Study>(base.UnitWork).GetModel() .Where(i => i.ClassroomPlanID == 0 && i.StudyStatus == (int)StudyStatus.Study)
on new user_classroom
{
UserInfoID = erInfoID,
ClassroomInfoID = user_classrooms.ClassroomInfoID
} equals new user_classroom
{
UserInfoID = user_ClassroomPlan_erInfoID,
ClassroomInfoID = user_ClassroomPlan_Study.ClassroomInfoID
} into userplane
let status = userplane.Count() == 0 ? (int)StudyStatus.Study : (int)StudyStatus.Finish
let scale = (list.Count() == 0) ? 0 : userplane.Count() - 1 / list.Count()
select new Classroom_Info_Ext
{
ClassroomInfoID = classroom_Info.ClassroomInfoID,
Title = classroom_Info.Title,
Type = classroom_Info.Type,
EndTime = user_classrooms.EndTime,
Student_Info = student,
Teacher_Info = teacher,
StudyScale = scale,
StudyStatus = (StudyStatus)status,
Classroom_CommonValue_R = (List<Classroom_CommonValue_R>)valueList //这⾥这前是valueList.ToList()
};
⽽在分页返回时,也使⽤了类型转换,这种转换是内存中⾃动完成,所以性能⽅⾯不⽤考虑
var result = linq.AsQueryable<Classroom_Info>().Where(spec.SatisfiedBy()).OrderBy(i => i.ClassroomInfoID);
return new PagedList<Classroom_Info>(result, pp.PageIndex, pp.PageSize);
对于linq to entity有很多不便的地⽅,如在使⽤skip之前,必须要对iqueryable进⾏ordery操作;在实体赋值时不能使⽤逻辑判断等等。