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 student.UserInfoID equals user_classrooms.UserInfoID
                       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_Info.UserInfoID equals teacher.UserInfoID
                       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 = student.UserInfoID,
                           ClassroomInfoID = user_classrooms.ClassroomInfoID
                       } equals new user_classroom
                       {
                           UserInfoID = user_ClassroomPlan_Study.UserInfoID,
                           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操作;在实体赋值时不能使用逻辑判断等等

本文转自博客园张占岭(仓储大叔)的博客,原文链接:EF架构~为导航属性赋值时ToList()的替换方案,如需转载请自行联系原博主。

目录
相关文章
|
8月前
|
SQL 安全 网络安全
交易所开发测试版丨交易所系统开发规则玩法/架构设计/项目步骤/方案逻辑/案例解析/源码部署
The development process of the exchange system involves multiple steps and links. The following is the detailed process and steps for the development of the exchange system:
|
10月前
|
存储 负载均衡 容灾
MySQL数据库的分布式架构和数据分片方案
MySQL数据库的分布式架构和数据分片方案
|
2月前
|
存储 Java 应用服务中间件
【分布式技术专题】「架构实践于案例分析」盘点互联网应用服务中常用分布式事务(刚性事务和柔性事务)的原理和方案
【分布式技术专题】「架构实践于案例分析」盘点互联网应用服务中常用分布式事务(刚性事务和柔性事务)的原理和方案
54 0
|
2月前
|
canal 消息中间件 关系型数据库
【分布式技术专题】「分布式技术架构」MySQL数据同步到Elasticsearch之N种方案解析,实现高效数据同步
【分布式技术专题】「分布式技术架构」MySQL数据同步到Elasticsearch之N种方案解析,实现高效数据同步
90 0
|
2月前
|
Web App开发 监控 应用服务中间件
全新架构!日志服务 SLS 自研免登录方案发布
全新架构!日志服务 SLS 自研免登录方案发布
87447 7
|
3月前
|
SQL 存储 缓存
后端架构优化方案探讨
【2月更文挑战第6天】在当今互联网时代,后端的稳定性和高效性至关重要。本文从数据库设计、服务器负载均衡、缓存策略等方面,探讨了后端架构优化的方案,旨在提供一些实用性的建议。
|
8月前
|
消息中间件 缓存 NoSQL
|
7月前
|
开发框架 运维 测试技术
ARBT(阿尔比特)智能合约系统开发稳定版/详细案例/步骤逻辑/需求方案/成熟技术/源码架构
需求分析:与客户充分沟通,了解其业务需求和期望,明确系统的功能和性能要求。
|
8月前
|
Kubernetes Cloud Native API
一种基于事件驱动架构的 SAP 产品集成方案介绍
一种基于事件驱动架构的 SAP 产品集成方案介绍
84 1
|
11月前
带你读《阿里云卓越架构白皮书》——3、设计方案(1)
带你读《阿里云卓越架构白皮书》——3、设计方案(1)
292 0