当前位置: 首页 > news >正文

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的一对一与一对多,如需转载请自行联系原博主。

相关文章:

  • Linux一般由四个主要部分组成
  • sshfs
  • Trie树(字典树)
  • MYSQL 的一些基本操作
  • Alpine上安装Docker引擎
  • glulookat函数
  • oracle执行一条插入语句一直执行
  • SAP QM Batch to Batch的转移过账事务中的Vendor Batch
  • addMusic 和playMusic(AVAudioPlayer)
  • 12:Web及MySQL服务异常监测案例
  • 一个***的自白:年赚两三百万 生活纸醉金迷(3)
  • weex 项目开发(四)项目框架搭建 及 自定义 TabBar 组件
  • 项目规划管理 - 1
  • C# DLL资源文件打包(图片、JS、CSS)[WebResource]
  • 阅读摘要
  • JS 中的深拷贝与浅拷贝
  • @jsonView过滤属性
  • [deviceone开发]-do_Webview的基本示例
  • “Material Design”设计规范在 ComponentOne For WinForm 的全新尝试!
  • 2017前端实习生面试总结
  • bearychat的java client
  • ECMAScript6(0):ES6简明参考手册
  • HTTP传输编码增加了传输量,只为解决这一个问题 | 实用 HTTP
  • Java程序员幽默爆笑锦集
  • JS+CSS实现数字滚动
  • JS笔记四:作用域、变量(函数)提升
  • seaborn 安装成功 + ImportError: DLL load failed: 找不到指定的模块 问题解决
  • Spring Cloud Feign的两种使用姿势
  • SSH 免密登录
  • storm drpc实例
  • Vue.js 移动端适配之 vw 解决方案
  • 第2章 网络文档
  • 警报:线上事故之CountDownLatch的威力
  • 如何抓住下一波零售风口?看RPA玩转零售自动化
  • 使用SAX解析XML
  • 提醒我喝水chrome插件开发指南
  • linux 淘宝开源监控工具tsar
  • 说说我为什么看好Spring Cloud Alibaba
  • ​​​​​​​​​​​​​​汽车网络信息安全分析方法论
  • ​草莓熊python turtle绘图代码(玫瑰花版)附源代码
  • "无招胜有招"nbsp;史上最全的互…
  • #1015 : KMP算法
  • #Linux(Source Insight安装及工程建立)
  • #我与Java虚拟机的故事#连载15:完整阅读的第一本技术书籍
  • (1)Android开发优化---------UI优化
  • (6)STL算法之转换
  • (function(){})()的分步解析
  • (PyTorch)TCN和RNN/LSTM/GRU结合实现时间序列预测
  • (动手学习深度学习)第13章 计算机视觉---图像增广与微调
  • (附源码)python旅游推荐系统 毕业设计 250623
  • (附源码)小程序儿童艺术培训机构教育管理小程序 毕业设计 201740
  • (十八)用JAVA编写MP3解码器——迷你播放器
  • (原創) 如何優化ThinkPad X61開機速度? (NB) (ThinkPad) (X61) (OS) (Windows)
  • (转)memcache、redis缓存
  • *Django中的Ajax 纯js的书写样式1