【原创】基于.NET的轻量级高性能 ORM - TZM.XFramework 之优雅增删改
【前言】
大家好,我是TANZAME。出乎意料的,我们在立冬的前一天又见面了,天气慢慢转凉,朋友们注意添衣保暖,愉快撸码。距离 TZM.XFramework 的首秀已数月有余,期间收到不少朋友的鼓励、建议和反馈,在此致以深深的感谢。
不少围观的朋友经常问题我,.NET 体系下优秀的 O/RM 官方的有EF,第三方的有linq2db (国外)、StackExchange/Dapper (国外)、NHibernate (国外)、PetaPoco (国外)、Freesql (国内)等等,What's your problem?Ok,咱们就用一分钟的时间聊聊 What's my Advantage,聊聊如何用 ORM 优雅的进行增删改。
【正文】
相信朋友们都遇到过这样的场景:要插入/删除/修改的数据来自外键表,怎么办?先查出来再进行接下的操作吗,别这样老铁,至少两次以上的数据库访问会让有洁癖的你感到“菊”部瘙痒。手撸纯 SQL吗,看起来还行至少不会那么令人不舒服。如果有 ORM 能帮我们撸这种 SQL,岂不更痛快?来看看我们的 ORM 是怎么操作的:
1. 多表关联更新
// 更新本表值等于别表的字段值 var query = from a in context.GetTable<Model.Client>() join b in context.GetTable<Model.CloudServer>() on a.CloudServerId equals b.CloudServerId join c in context.GetTable<Model.ClientAccount>() on a.ClientId equals c.ClientId where c.AccountId == "1" select a; context.Update<Model.Client, Model.CloudServer, Model.ClientAccount>((a, b, c) => new { CloudServerId = b.CloudServerId, Qty = c.Qty > 0 ? c.Qty : 1, }, query); context.SubmitChanges(); -- 产生的SQL --UPDATE t0 SET --t0.[CloudServerId] = t1.[CloudServerId] --FROM [Bas_Client] AS [t0] --INNER JOIN [Sys_CloudServer] t1 ON t0.[CloudServerId] = t1.[CloudServerId] --INNER JOIN [Bas_ClientAccount] t2 ON t0.[ClientId] = t2.[ClientId] --WHERE t2.[AccountId] = @p0 --UPDATE t0 SET --t0.[CloudServerId] = t1.[CloudServerId], --t0.[Qty] = (CASE WHEN t2.[Qty] > @p1 THEN t2.[Qty] ELSE @p2 END) --FROM [Bas_Client] AS [t0] --INNER JOIN [Sys_CloudServer] t1 ON t0.[CloudServerId] = t1.[CloudServerId] --INNER JOIN [Bas_ClientAccount] t2 ON t0.[ClientId] = t2.[ClientId] --WHERE t2.[AccountId] = @p3
2. 多表关联插入
// 多表关联批量新增 var query = from a in context.GetTable<Model.Client>() join b in context.GetTable<Model.CloudServer>() on a.CloudServerId equals b.CloudServerId where a.ClientId <= 5 && b.CloudServerId != 0 select new Model.Client { ClientId = DbFunction.RowNumber<int>(x => a.ClientId) + (maxClientId + 2), ClientCode = "ABC2", ClientName = "啊啵呲2", CloudServerId = b.CloudServerId, State = 2, ActiveDate = DateTime.Now }; context.Insert(query); -- 产生的SQL --INSERT INTO [Bas_Client]([ClientId],[ClientCode],[ClientName],[CloudServerId],[State],[ActiveDate]) --SELECT --ROW_NUMBER() Over(Order By t0.[ClientId]) + @p17 + @p18 AS [ClientId], --@p19 AS [ClientCode], --@p20 AS [ClientName], --t1.[CloudServerId] AS [CloudServerId], --@p21 AS [State], --@p22 AS [ActiveDate] --FROM [Bas_Client] t0 --INNER JOIN [Sys_CloudServer] t1 ON t0.[CloudServerId] = t1.[CloudServerId] --WHERE t0.[ClientId] <= @p23 AND t1.[CloudServerId] <> @p24
3. 多表关联删除
// Query 关联批量删除 var query = from a in context.GetTable<Model.Client>() join b in context.GetTable<Model.ClientAccount>() on a.ClientId equals b.ClientId join c in context.GetTable<Model.ClientAccountMarket>() on new { b.ClientId, b.AccountId } equals new { c.ClientId, c.AccountId } where c.ClientId > 100 && c.AccountId == "1" && c.MarketId == 1 select a; context.Delete<Model.Client>(query1); -- 产生的SQL --DELETE t0 FROM [Bas_Client] t0 --INNER JOIN [Bas_ClientAccount] t1 ON t0.[ClientId] = t1.[ClientId] --INNER JOIN [Bas_ClientAccountMarket] t2 ON t1.[ClientId] = t2.[ClientId] AND t1.[AccountId] = t2.[AccountId] --WHERE t2.[ClientId] > @p2 AND t2.[AccountId] = @p3 AND t2.[MarketId] = @p4
【结语】
经过大半月的努力,TZM.XFramework 也已正式支持 SQLite了,托管地址:GitHub托管地址:https://github.com/TANZAME/XFramework 。最后借用某公众号上面的一句话与大家共勉,有趣和好奇心是为了取悦自己,然后才能有意思和有用是去取悦别人。撸码不易,不喜轻喷,有不同看法老友欢迎加群交流。
技术交流群:816425449
【原创】基于.NET的轻量级高性能 ORM - TZM.XFramework 之优雅增删改的更多相关文章
- 【原创】基于.NET的轻量级高性能 ORM - TZM.XFramework
[前言] 接上一篇<[原创]打造基于Dapper的数据访问层>,Dapper在应付多表自由关联.分组查询.匿名查询等应用场景时不免显得吃力,经常要手写SQL语句(或者用工具生成SQL配置文 ...
- 【原创】基于.NET的轻量级高性能 ORM - TZM.XFramework 之让代码更优雅
[前言] 大家好,我是TANZAME.出乎意料的,我们在立冬的前一天又见面了,天气慢慢转凉,朋友们注意添衣保暖,愉快撸码.距离 TZM.XFramework 的首秀已数月有余,期间收到不少朋友的鼓励. ...
- 基于renren-fast的快速入门项目实战(实现报表增删改查)
基于renren-fast的快速入门项目实战(实现报表增删改查) 说明:renren-fast是一个开源的基于springboot的前后端分离手脚架,当前版本是3.0 官方开发文档需付费,对于新手而言 ...
- DjangoMTV模型之model层——ORM操作数据库(基本增删改查)
Django的数据库相关操作 对象关系映射(英语:(Object Relational Mapping,简称ORM),是一种程序技术,用于实现面向对象编程语言里不同类型系统的数据之间的转换.从效果上说 ...
- 如何基于Restful ABAP Programming模型开发并部署一个支持增删改查的Fiori应用
Jerry之前的文章30分钟用Restful ABAP Programming模型开发一个支持增删改查的Fiori应用 发布之后,有朋友问我,"没错, 我是在你的文章里看到了Fiori应用的 ...
- ORM 实现数据库表的增删改查
这次通过反射技术来实现一下数据库表的增删改查对象关系映射(英语:Object Relational Mapping,简称ORM,或O/RM,或O/R mapping) 注:引用时约束了以下几点: 数据 ...
- Django ORM基本的单表增删改查
创建表 步骤: 1.app下models.py里创建类(继承models.Model) from django.db import models class UserInfo(models.Model ...
- django 利用ORM对单表进行增删改查
牛小妹上周末,一直在尝试如何把数据库的数据弄到界面上.毕竟是新手,搞不出来,文档也看不懂.不过没关系,才刚上大学.今晚我们就来解释下,要把数据搞到界面的第一步.先把数据放到库里,然后再把数据从库里拿出 ...
- 轻量级高性能ORM框架:Dapper高级玩法
Dapper高级玩法1: 数据库中带下划线的表字段自动匹配无下划线的Model字段. Dapper.DefaultTypeMap.MatchNamesWithUnderscores = true; 备 ...
随机推荐
- [数学基础]奇异值分解SVD
之前看到过很多次奇异值分解这个概念,但我确实没有学过.大学线性代数课教的就是坨屎,我也没怎么去上课,后来查了点资料算是搞清楚了,现在写点东西总结一下. 奇异值分解,就是把一个矩阵拆成一组矩阵之和.在数 ...
- 阿里云VS腾讯云 谁才是中国未来的云计算之王?
阿里云早在 2009 年就已经开始布局云计算领域,具有先发优势.据统计,40% 的中国 500 强企业.近一半中国上市公司.80% 中国科技类公司是阿里云的客户.而腾讯云基于腾讯自身在游戏.视频.社交 ...
- 04、JDBC范例
范例:JDBC查询 package com.hsp; import java.sql.Connection; import java.sql.DriverManager; import java.sq ...
- Spring5源码解析5-ConfigurationClassPostProcessor (上)
接上回,我们讲到了refresh()方法中的invokeBeanFactoryPostProcessors(beanFactory)方法主要在执行BeanFactoryPostProcessor和其子 ...
- js对象参考手册 -戈多编程
今天来总结下常用的熟记的js api (一)JavaScript对象 (1)Array 对象属性:(3个) constructor lengh prototype 对象方法:(14个) contat( ...
- Kubernetes+Docker+Istio 容器云实践
随着社会的进步与技术的发展,人们对资源的高效利用有了更为迫切的需求.近年来,互联网.移动互联网的高速发展与成熟,大应用的微服务化也引起了企业的热情关注,而基于Kubernetes+Docker的容器云 ...
- 「3D建模」ZBrush如何雕刻头部
加载项目开始 1. 如果未显示灯箱,请按逗号(,)或灯箱按钮. 2. 单击项目选项卡,然后双击DefaultSphere项目.它将被加载到ZBrush中. 3. 在工具>几何子选项板中,将SDi ...
- python selenium鼠标滑动操作
先安装pyautogui: pip install pyautogui #coding=utf-8 import pyautogui from selenium import webdriver fr ...
- 渗透-svn源代码泄露漏洞综合利用
SVN是Subversion的简称,是一个开放源代码的版本控制系统,相较于RCS.CVS,它采用了分支管理系统,它的设计目标就是取代CVS.互联网上很多版本控制服务已从CVS迁移到Subversion ...
- 微信小程序尺寸单位rpx以及样式相关介绍
rpx单位是微信小程序中css的尺寸单位,rpx可以根据屏幕宽度进行自适应.规定屏幕宽为750rpx.如在 iPhone6 上,屏幕宽度为375px,共有750个物理像素,则750rpx = 375p ...