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() }
我们可以看到,它的巧妙是在数据赋值上...
看一个数据库的监控
刚看到后,真是下了我一大跳,怎么连了这么多库呀,晕,然后,本地设断点调试了一下,原来和我的代码没有关系,是其它代码惹的祸!
我的代码运行是这样的
这是可以接受的,在我的预料之中,呵呵。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
2011-08-18 今天抽点时间来说一个C#里的关键字及它们的原型