第四十回 EF架构~LinqToEntity里实现left join的一对一与一对多

回到目录

对于linq to sql里实现left join我已经介绍过了,这篇文章的出现是由于最近在项目里遇到的一个问题,解决这个问题花了我不少时间,可能有2个小时,事件是这样的,对于两个表,它们是一对多关系,而需求是返回一个一对一的关系,并将最新的数据返回,这个很多同学都知道,可以使用inner join,但是,对于inner  join来说,当处理的是一对多关系时,它将会出现多条记录,这也是正常的;而它并不满足我们今天的需求,经过测试后,找到了解决这个问题的方法,下面看代码:

一对多关系

from r in base.GetModel()
join data in new TsingDa_NewLearningBarRepository<FAQ_Reply>(UnitWork).GetModel().Where(i => i.Status == (int)Status.Normal)
on r.FAQInfoID equals data.FAQInfoID into list

这个很容易理解,将满足faqinfoId的FAQ_Reply集合获出,放入list变量中。

一对一关系

from r in base.GetModel()
join data in new TsingDa_NewLearningBarRepository<FAQ_Reply>(UnitWork).GetModel().Where(i => i.Status == (int)Status.Normal)
on r.FAQInfoID equals data.FAQInfoID

这种写法是正规的inner join写法,它适合于数据结构中的一对一关系,即两张表有相同的主键,它们在数据中是严格一对一的,如果不是一对一,那种,这个语句将会出现重复数据!

下面是在EF中对left  join进行的一对一改造

 join data in new TsingDa_NewLearningBarRepository<FAQ_Reply>(UnitWork).GetModel().Where(i => i.Status == (int)Status.Normal)
 on r.FAQInfoID equals data.FAQInfoID into list
 from data in list.EmptyOrDefalt()

可很遗憾,并不成功,还是返回的重复数据,这在传统的linq to sql中是可以的,但在linq to entity中是不行的,因为它们生成SQL语句的内核不同

正确的一对一做法

 join data in new TsingDa_NewLearningBarRepository<FAQ_Reply>(UnitWork).GetModel().Where(i => i.Status == (int)Status.Normal)
 on r.FAQInfoID equals data.FAQInfoID into list
 select new FAQ_Info_Ext()
 {
  FAQReply = list.OrderByDescending(i => i.AddTime).FirstOrDefault()
 }

我们可以看到,它的巧妙是在数据赋值上...

看一个数据库的监控

刚看到后,真是下了我一大跳,怎么连了这么多库呀,晕,然后,本地设断点调试了一下,原来和我的代码没有关系,是其它代码惹的祸!

我的代码运行是这样的

这是可以接受的,在我的预料之中,呵呵。

回到目录

第四十回 EF架构~LinqToEntity里实现left join的一对一与一对多

时间: 2024-11-12 15:54:47

第四十回 EF架构~LinqToEntity里实现left join的一对一与一对多的相关文章

【SSH三大框架】Hibernate基础第十二篇:load()懒加载分析以及一对一、一对多、多对一、多对多懒加载的分析

一.懒加载的定义: 懒加载:在WEB应用程序中,经常会需要查询数据库,系统的响应速度在很大程度上是与数据库交互的响应.因此,如果能够优化与数据库的交互速度,则能够大大提高WEB应用的响应速度. 例如:当有一个Student类和一个Teacher类.当我们加载一个学生的所有信息,包括:学号,姓名等属性后,此时Student类中的Teacher类型的属性为null,当我们需要知道这个Student对应的Teacher属性的时候,我们才去加载这个Teacher对象. 如果,我们只需要知道学生信息,我们

EF架构~为EF DbContext生成的实体添加注释(T5模板应用)

相关文章系列 第八回 EF架构~将数据库注释添加导入到模型实体类中 第二十一回  EF架构~为EF DbContext生成的实体添加注释(T4模板应用) 第二十二回EF架构~为EF DbContext生成的实体添加注释(T5模板应用) 嗨,没法说,EF4的TT模版加上注释后,升级到EF5的TT模版后,注释就不通用了,所以,还得再研究一下,然后把操作方法再分享出来,没辙的微软! T4模版可能有些凌乱,这在T5模版里有了不错的改进,但我希望解决的问题在T5里并没有得到解决,那就是TT类文件自动得到E

EF架构~基于EF数据层的实现

回到目录 之前写过关于实现一个完整的EF架构的文章,文章的阅读量也是满大的,自己很欣慰,但是,那篇文章是我2011年写的,所以,技术有些不成熟,所以今天把我的2014年写的EF底层架构公开一下,这个架构比2011年的有了很大程度的提高,主要在接口规范,查询规范上,并引入了排序功能,两步对完善了EF对数据的批量操作,可以说,这次的架构是很有看点的. 一 一个基础操作接口 /// <summary> /// 基础的数据操作规范 /// 与ORM架构无关 /// </summary> /

EF架构~通过EF6的DbCommand拦截器来实现数据库读写分离~终结~配置的优化和事务里读写的统一

回到目录 本讲是通过DbCommand拦截器来实现读写分离的最后一讲,对之前几篇文章做了一个优化,无论是程序可读性还是实用性上都有一个提升,在配置信息这块,去除了字符串方式的拼接,取而代之的是section数组,这样在修改配置时更加清晰了:而实用性上,彻底改变了读和写不能共用一个仓储对象的缺点,并且在一个事务里可以读写并存,并为了数据的一致性,使事务里的curd操作指向主库,这一点很重要! 前几篇文章的目录 EF架构~通过EF6的DbCommand拦截器来实现数据库读写分离~再续~添加对各只读服

2018-09-08 第四十、四十一次课

第四十.四十一次课 Docker入门 目录 一. docker简介 二. 安装docker 三. 镜像管理 四. 通过容器创建镜像 五. 通过模板创建镜像 六. 容器管理 七. 仓库管理 八. 数据管理 九. 数据卷备份恢复 十. docker网络模式 十一. opration not permitted 十二. 配置桥接网络 十三. Dockerfile格式 十四. Dockerfile示例(安装nginx) 十五. 用docker compose部署服务 十六. docker compose

QT开发(四十)——GraphicsView编程

QT开发(四十)--GraphicsView编程 一.QGraphicsScene 1.QGraphicsScene QGraphicsScene继承自QObject,是一个管理图元的容器,与QGraphicsView合用可以在2D屏幕上显示如线.三角形.文本.自定义图元等图元. QGraphicsScene是不可见的,只用于管理图元.为了查看场景,需要创建一个视图组件. 一个场景分为三个层:图元层.前景层和背景层.场景的绘制总是从背景层开始,然后是图形项层,最后是前景层. 2.事件处理与传播

(二)第十回 同日生辰情解契语 异姓兄弟冰释嫌隙[林大帅作品集]

(二)第十回 同日生辰情解契语 异姓兄弟冰释嫌隙               自那日众人商量了蹴球之事,次日,便邀了各班或段队.平日里皆识于球场,不过碰面一提,那学弟们便领命,携贴而去.每日功课已毕众人便在球场,这高二文科队,因前有阿四冲锋,后又林二坐镇,并有小谢辅佐,加之队长国仁.可谓遇佛杀佛,日后也是这等阵容,挑战兴化府各大书院.今晚林二踱至阿清店门口,不禁愣住,只见阿四与那三大个同桌吃面.就那阿清也忙着上菜,照顾不停.阿四见那廊下立着林二,便照顾过来.那三人也点头示意,阿四打个长嗝,叫阿清

第十回(一) 同日生辰情解契语 异姓兄弟冰释嫌隙

(一) 第十回 同日生辰情解契语 异姓兄弟冰释嫌隙 诗曰:怀璧沉吟亦参差,契合良辰语又迟. 当日承情几多重,便是暗写心意时               话接上回,那林二与阿四蹴球泄愤直至深夜,其余诸人不过摔个酒壶,骂上两句完事.见两人有这等心气,日后在场上也是尊重不少.时文会学子除功课外,那宫商,骑射诸科皆有强人.如那蹴球,投球,疾走几项,于兴化府中不让群雄.如那谢宋二姑娘,所引音乐生等,是时不过初三年纪.或竞以歌咏,或奏以筝琴,皆出于那荔城庸常人之上.说书人日后或遇飙音高人,几睹竞技好手,依旧

第四十八章

第四十八章1 人生的“减法”,你会做吗? 为学者日益,为道者日损 把事情当做学问来研究的人,欲望越来越多,追求道的人,欲望越来越少. 做“减法”是我们需要的人生智慧. 各位亲爱的朋友,我们今天接着来聊<道德经>.今天来到了新的一章,四十八章,各位一定要好好学第四十八章,因为四十八章里的话特别的有用.特别的深刻. 我们先来学头两句,老子说,“为学者日益,为道者日损”,就这两句话,里边道理非常深,我给大家先解释一遍,“为学者日益”就是把事情当做学问来研究的,这些人做事越做越多,学的越学越多,也就是