EF架构~linq模拟left join的两种写法,性能差之千里!

简介:

对于SQL左外连接我想没什么可说的,left join将左表数据都获出来,右表数据如果在左表中不存在,结果为NULL,而对于LINQ来说,要实现left join的效果,也是可以的,在进行join时直接into到集合变量就可以了,但在赋值时,如果只需要集合的一条记录,那在写法上又会有两种,而这两种写法所产生的性能是相关千里的,下面来看一下.

首先是SQL的左外连接

SELECT  [t6].[CourseID] ,
        [t6].[UserID] ,
        [t6].[CourseName] ,
        [t6].[ResourceID] ,
        [t6].[StudyTime] ,
        [t6].[BeginTime] ,
        [t6].[EndTime] ,
        [t6].[value] AS [CategoryID] ,
        [t6].[value2] AS [ClassHour] ,
        [t6].[value3] AS [Percent] ,
        [t6].[test] ,
        [t6].[ID] ,
        [t6].[SmallPicture]
FROM    dbo.User_Course AS t6
        LEFT  OUTER JOIN [User_StudyRecord] AS t3 ON t6.UserID = t3.UserID
                                                     AND t3.ResourceID = t6.ResourceID

当它被翻译成LINQ之后,是分页产生的结果,所以感觉更很乱了,呵呵,(LINQ在翻译SQL时,本来就够乱的,再一分页,用上row_number,更乱了),但结果是一样的,

咱们就不管微软是怎么翻译的了

我们重要是看一下,实现时LINQ代码的写法

第一种,性能低下的,如果结果为20条记录,那它需要多连接20次

            var linq = from _data in new User_Course(UnitOfWork).GetEntities()
                       let list = new Res_Item(UnitOfWork).GetEntities().Select(t => new Entity.Res_Item
                       {
                           ID = t.ID,
                           SmallPicture = t.SmallPicture,
                       }).Where(i => i.ID == _data.ResourceID)
           
                       let list2 = new User_StudyRecord(UnitOfWork).GetModel().Select(r => new Entity.User_StudyRecord
                       {
                           StudyContent = r.StudyContent,
                           UserID = r.UserID,
                           Res_ItemID = r.Res_ItemID,
                       }).Where(i => i.Res_ItemID == _data.ResourceID && i.UserID == _data.UserID)
                       from record in list2.DefaultIfEmpty()
                       where _data.CategoryID != (int)CustomEnum.CategoryType.BroadcastProgram
                       && _data.CategoryID != (int)CustomEnum.CategoryType.AskRoom
                       select new Entity.User_Course
                       {
                           CourseID = _data.CourseID,
                           UserID = _data.UserID,
                           CourseName = _data.CourseName,
                           ResourceID = _data.ResourceID,
                           StudyTime = _data.StudyTime,
                           BeginTime = _data.BeginTime,
                           EndTime = _data.EndTime,
                           CategoryID = _data.CategoryID ?? 2,
                           Res_Item = list.FirstOrDefault(),
                           ClassHour = _data.ClassHour ?? 0,
                           Percent = _data.Percent ?? 0,
                           Prev_ResourceName = record == null ? string.Empty : record.StudyContent,
                       };

第二种,性能较好的

总结:对于第一种性能较差的写法产生的结果,类似于LINQ本身提交的延时加载,即结果集中,每条记录都去查询数据库,它不会一次将数据获出来,这种作用在特定场合是

有它的好处的,但不适用于所有,当返回结果集比较大时,不应该使用延时加载!

本文转自博客园张占岭(仓储大叔)的博客,原文链接:EF架构~linq模拟left join的两种写法,性能差之千里!,如需转载请自行联系原博主。

目录
相关文章
|
3月前
|
存储 缓存 Cloud Native
MPP架构数据仓库使用问题之ADB PG云原生版本的扩缩容性能怎么样
MPP架构数据仓库使用问题之ADB PG云原生版本的扩缩容性能怎么样
MPP架构数据仓库使用问题之ADB PG云原生版本的扩缩容性能怎么样
|
6月前
|
缓存 NoSQL 应用服务中间件
性能基础之大型网站架构演化(整理篇)
【2月更文挑战第14天】性能基础之大型网站架构演化(整理篇)
94 1
性能基础之大型网站架构演化(整理篇)
|
12月前
|
算法 编译器
【计算机架构】响应时间和吞吐量 | 相对性能 | 计算 CPU 时间 | 指令技术与 CPI | T=CC/CR, CC=IC*CPI
【计算机架构】响应时间和吞吐量 | 相对性能 | 计算 CPU 时间 | 指令技术与 CPI | T=CC/CR, CC=IC*CPI
1075 1
|
2月前
|
设计模式 Java 关系型数据库
【Java笔记+踩坑汇总】Java基础+JavaWeb+SSM+SpringBoot+SpringCloud+瑞吉外卖/谷粒商城/学成在线+设计模式+面试题汇总+性能调优/架构设计+源码解析
本文是“Java学习路线”专栏的导航文章,目标是为Java初学者和初中高级工程师提供一套完整的Java学习路线。
330 37
|
26天前
|
安全 数据安全/隐私保护 UED
优化用户体验:前后端分离架构下Python WebSocket实时通信的性能考量
在当今互联网技术的迅猛发展中,前后端分离架构已然成为主流趋势,它不仅提升了开发效率,也优化了用户体验。然而,在这种架构模式下,如何实现高效的实时通信,特别是利用WebSocket协议,成为了提升用户体验的关键。本文将探讨在前后端分离架构中,使用Python进行WebSocket实时通信时的性能考量,以及与传统轮询方式的比较。
54 2
|
2月前
|
缓存 运维 NoSQL
二级缓存架构极致提升系统性能
本文详细阐述了如何通过二级缓存架构设计提升高并发下的系统性能。
111 12
|
2月前
|
缓存 安全 Java
如何利用Go语言提升微服务架构的性能
在当今的软件开发中,微服务架构逐渐成为主流选择,它通过将应用程序拆分为多个小服务来提升灵活性和可维护性。然而,如何确保这些微服务高效且稳定地运行是一个关键问题。Go语言,以其高效的并发处理能力和简洁的语法,成为解决这一问题的理想工具。本文将探讨如何通过Go语言优化微服务架构的性能,包括高效的并发编程、内存管理技巧以及如何利用Go生态系统中的工具来提升服务的响应速度和资源利用率。
|
3月前
|
缓存 前端开发 算法
Fiber 架构如何提高性能和响应性的
【8月更文挑战第6天】Fiber 架构如何提高性能和响应性的
44 1
|
3月前
|
消息中间件 缓存 Java
如何优化大型Java后端系统的性能:从代码到架构
当面对大型Java后端系统时,性能优化不仅仅是简单地提高代码效率或硬件资源的投入,而是涉及到多层次的技术策略。本篇文章将从代码层面的优化到系统架构的调整,详细探讨如何通过多种方式来提升Java后端系统的性能。通过对常见问题的深入分析和实际案例的分享,我们将探索有效的性能优化策略,帮助开发者构建更高效、更可靠的后端系统。
|
4月前
|
安全 数据安全/隐私保护 UED
优化用户体验:前后端分离架构下Python WebSocket实时通信的性能考量
【7月更文挑战第17天】前后端分离趋势下,WebSocket成为实时通信的关键,Python有`websockets`等库支持WebSocket服务。与HTTP轮询相比,WebSocket减少延迟,提高响应。连接管理、消息传输效率、并发处理及安全性是性能考量重点。使用WebSocket能优化用户体验,尤其适合社交、游戏等实时场景。开发应考虑场景需求,充分利用WebSocket优势。
135 3