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

目录
相关文章
|
SQL 存储 人工智能
MyCat-架构剖析-核心技术之跨库 join 实现 | 学习笔记
快速学习 MyCat-架构剖析-核心技术之跨库 join 实现
MyCat-架构剖析-核心技术之跨库 join 实现 | 学习笔记
|
SQL 机器学习/深度学习 Cloud Native
.NET 云原生架构师训练营(模块二 基础巩固 EF Core 更新和迁移)--学习笔记
- 状态 - 自动变更检测 - 不查询删除和更新 - 并发
252 0
.NET 云原生架构师训练营(模块二 基础巩固 EF Core 更新和迁移)--学习笔记
|
SQL Cloud Native 架构师
.NET 云原生架构师训练营(模块二 基础巩固 EF Core 查询)--学习笔记
- 关联数据加载 - 客户端与服务端运算 - 跟踪与不跟踪 - 复杂查询运算 - 原生 SQL 查询 - 全局查询筛选器
243 0
.NET 云原生架构师训练营(模块二 基础巩固 EF Core 查询)--学习笔记
|
Cloud Native 架构师
|
存储 开发框架 Cloud Native
.NET 云原生架构师训练营(模块二 基础巩固 EF Core 基础与配置)--学习笔记
- 连接字符串 - 异步编程 - 日志 - DbContext池 - 类和配置表 - 属性和列配置 - 并发token - 索引
307 0
.NET 云原生架构师训练营(模块二 基础巩固 EF Core 基础与配置)--学习笔记
|
SQL Cloud Native 架构师
.NET 云原生架构师训练营(模块二 基础巩固 EF Core 介绍)--学习笔记
- ORM - Repository 仓储 - UnitOfWork 工作单元 - DB Context 与 DB Set - EF Core快速开始示例
290 0
.NET 云原生架构师训练营(模块二 基础巩固 EF Core 介绍)--学习笔记
|
云栖大会 物联网 开发者
【云栖活动】架构师、产品经理一对一座谈会/WORKSHOP-已截止
阿里云IoT为开发者提供连续3天的技术活动,热门产品PD、架构师与您面对面沟通,9月25-26日活动在阿里云飞天园区,不需要云栖门票就可以参与,9月27日是在云栖大会场内,需要持有云栖大会门票才能参与。