国产精品ORM框架-SqlSugar详解 进阶功能 集成整合 脚手架应用 附源码 云草桑 专题二

news2024/9/20 7:54:13

国产精品ORM框架-SqlSugar详解 SqlSugar初识 专题一-CSDN博客
sqlsugar 官网-CSDN博客

4、进阶功能

5、集成整合

6、脚手架应用

4、进阶功能

4.1、生命周期

Queryable 什么时候操作库
Queryable是一个引用类型
Queryable拷贝机制
{
    ISugarQueryable<Student> query = db.Queryable<Student>();


    List<Student> studentList = query.ToList();
    Student[] studentList1 = query.ToArray();

    //ISugarQueryable 对象的内部,包含了如何生成Sql语句;--包含了生成Sql语句的规则
    //包含了返回值;
    //作用:在调用给你的时候,可以把查询的对象,表达式目录树。。。解析,组合成成Sql语句,但是并不会到数据库中去查询;


    //如果在Tolist  Toarray的时候,ISugarQueryable 马上执行,开始按照规则生成Sql语句,就马上去数据库中去执行;
    //从queryable变成了List 这个时候类型发生变化 已经生成了SQL或者执行了数据库
}

{
    Console.WriteLine("===============================");
    var able = db.Queryable<Student>();
    able.Where(it => it.Id > 0);
    able.Where(it => it.Id > 0);

    var list = able.ToList();
    //where id>0 and tid>0
}

{
    var query = db.Queryable<Student>().Where(it => it.Id == 1);

    {
        int count = query.Count();
        List<Student> list = query.ToList();
        Student[] array = query.ToArray();
        string sqlString = query.ToSqlString();
    }

    //{
    //    int count = query.Clone().Count();//当query用于2个地方的时候一定要加Clone这点和EF有本质区别
    //    var list = query.Clone().ToList();
    //}
}

4.2、执行Sql

方法列表
方法名 描述 返回值
SqlQuery< T > 查询所有返回实体集合 List
SqlQuery<T,T2> 可以返回2个结果集 Tuple<List, List>
SqlQuerySingle 查询第一条记录 T
SqlQueryDynamic 查查询所有返回匿名对象 dynamic
GetDataTable 查询所有 DataTable
GetDataReader 读取DR需要手动释放DR DataReader
GetDataSetAll 获取多个结果集 DataSet
ExecuteCommand 返回受影响行数,一般用于增删改 int
GetScalar 获取首行首列 object
GetString 获取首行首列 string
GetInt 获取首行首列 int
GetLong 获取首行首列 long
GetDouble 获取首行首列 Double
GetDecimal 获取首行首列 Decimal
GetDateTime 获取首行首列 DateTime
 #region 输出Sql语句+数据库表初始化
 db.Aop.OnLogExecuting = (s, p) =>
 {
     Console.WriteLine("----------------------------");
     Console.WriteLine($"Sql语句:{s}");
 };
 if (db.DbMaintenance.IsAnyTable("UinitBlukTable", false))
 {
     db.DbMaintenance.DropTable<UinitBlukTable>();
 }
 db.CodeFirst.InitTables<UinitBlukTable>();

 #endregion 
 {
     //上面列表中 SqlQuery 等方法都可以不一定是GetDataTable
     {
         var dt = db.Ado.GetDataTable("select * from UinitBlukTable");
     }

     //参数1:简化用法
     {
         string sql = "select * from UinitBlukTable where id=@id and name like @name";
         var dt = db.Ado.GetDataTable(sql, new { id = 1, name = "%jack%" });
     }

     //参数2:复杂用法
     {
         string sql = "select * from   UinitBlukTable where id=@id and name like @name";
         var parameter = new List<SugarParameter>()
            {
               new SugarParameter("@id",1),
               new SugarParameter("@name","%jack%") //执行sql语句
            };
         var dt = db.Ado.GetDataTable(sql, parameter);
     }


     {
         //原生SQL用实体 sql 查询
         //比db.SqlQueryable兼容性更强,支持复杂SQL存储过程,缺点没有自带的分页操作
         List<UinitBlukTable> t1 = db.Ado.SqlQuery<UinitBlukTable>("select * from UinitBlukTable");


         //原生SQL用匿名对象 sql 查询
         List<dynamic> t2 = db.Ado.SqlQuery<dynamic>("select * from UinitBlukTable");

         //插入 更新操作一般用
         string sql = $"INSERT INTO [dbo].[UinitBlukTable] ([Id] ,[Name] ,[Create]) VALUES ('10000' ,'Richard' ,'{DateTime.Now.ToString()}')";
         db.Ado.ExecuteCommand(sql);

     }

     //调用存储过程
     {

         //带有output的存储过程 
         {
             var tableName = new SugarParameter("@tableName", "Company");
             var reFieldsStr = new SugarParameter("@ReFieldsStr", "*");
             var orderString = new SugarParameter("@orderString", "Id");
             var whereString = new SugarParameter("@whereString", "1=1");
             var pageSize = new SugarParameter("@pageSize", "10");
             var pageIndex = new SugarParameter("@PageIndex", 1);
             var TotalRecord = new SugarParameter("@TotalRecord", null, true);//设置为output 
             var dt = db.Ado.UseStoredProcedure().GetDataTable("SP_CustomPager", tableName, reFieldsStr, orderString, whereString, pageSize, pageIndex, TotalRecord);//返回dt 

             //数据总条数
             object recordCount = TotalRecord.Value;
         }
     }

     //查询两个结果集
     {
         var views = db.Ado.SqlQuery<Company, Company, Company>("select * from Company; select * from Company; select * from Company");//多实体
         var t1list = views.Item1;
         var t2list = views.Item2;
     }
 }

4.3 数据导入和更新+验证 


Excel导入到数据库
困难点: 数据的验证
insert into not exists (只插入不更新)
非主键用例
完整用例(增、删、改)
数据清洗一把梭
    #region 输出Sql语句+数据库表初始化
    db.Aop.OnLogExecuting = (s, p) =>
    {
        Console.WriteLine("----------------------------");
        Console.WriteLine($"Sql语句:{s}");
    };
    if (db.DbMaintenance.IsAnyTable("UinitBlukTable", false))
    {
        db.DbMaintenance.DropTable<UinitBlukTable>();
    }
    db.CodeFirst.InitTables<UinitBlukTable>();

    #region 只插入不更新
    {
        List<UinitBlukTable> list = new List<UinitBlukTable>();
        list.Add(new UinitBlukTable() { Id = 1, Name = "a", Create = DateTime.Now });
        list.Add(new UinitBlukTable() { Id = 2, Name = "a", Create = DateTime.Now });
        list.Add(new UinitBlukTable() { Id = 3, Name = "a", Create = DateTime.Now.AddYears(-2) });
        list.Add(new UinitBlukTable() { Id = 4, Name = "", Create = DateTime.Now.AddYears(-2) });
        {
            db.Deleteable<UinitBlukTable>().ExecuteCommand();
            var x = db.Storageable(list).SplitInsert(it => !it.Any()).ToStorage();
            x.AsInsertable.ExecuteCommand();//插入可插入部分
        }

        //缩写
        {
            db.Deleteable<UinitBlukTable>().ExecuteCommand();
            var x = db.Storageable(list)
                    .SplitInsert(it => !it.Any())
                    .ToStorage()
                    .AsInsertable.ExecuteCommand();
        }
    }
    #endregion

    #endregion 完整案例
    {
        List<UinitBlukTable> list2 = new List<UinitBlukTable>();
        list2.Add(new UinitBlukTable() { Id = 1, Name = "a", Create = DateTime.Now });
        list2.Add(new UinitBlukTable() { Id = 2, Name = "a", Create = DateTime.Now });
        list2.Add(new UinitBlukTable() { Id = 3, Name = "a", Create = DateTime.Now.AddYears(-2) });
        list2.Add(new UinitBlukTable() { Id = 4, Name = "", Create = DateTime.Now.AddYears(-2) });

        var x = db.Storageable(list2)
                .SplitError(it => string.IsNullOrEmpty(it.Item.Name), "名称不能为空")
                .SplitError(it => it.Item.Create < DateTime.Now.AddYears(-1), "不是今年的数据")
                .SplitDelete(it => it.Item.Create < DateTime.Now.AddYears(-10))//删除10年前数据
                                                                               //.Saveable() // Saveable 等于下面2行
                .SplitUpdate(it => it.Any())//数据库存在更新 根据主键
                .SplitInsert(it => true)//其余插入 
                .ToStorage();
        //输出统计
        输出错误信息     
        Console.WriteLine("插入 {0} 更新{1} 错误数据{2} 不计算数据{3} 删除数据{4},总共{5}",
                           x.InsertList.Count,
                           x.UpdateList.Count,
                           x.ErrorList.Count,
                           x.IgnoreList.Count,
                           x.DeleteList.Count,
                           x.TotalList.Count);
        Console.WriteLine("====================导入数据+验证=========================");
        foreach (var item in x.ErrorList)
        {
            Console.WriteLine("id等于" + item.Item.Id + " : " + item.StorageMessage);
        }
        x.AsInsertable.ExecuteCommand(); //执行插入
        x.AsUpdateable.ExecuteCommand(); //执行更新
        x.AsDeleteable.ExecuteCommand(); //执行删除  
    }
}

--new 20240716


4.4、并发控制、更新、版本控制


并发累计(累加)
防止提交覆盖(乐观锁)
不依赖库同步
并发幂等版本栈
 public class ULockEntity
 {
     [SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
     public int Id { get; set; }
     public string? Name { get; set; }
     [SugarColumn(IsEnableUpdateVersionValidation = true)]//标识版本字段
     public long Ver { get; set; }

     //支持Guid long string DateTime (不推荐DateTime 时间有精度问题)
     /

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1931099.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[Vulnhub] devt-improved slog_users+vim权限提升+nano权限提升+passwd权限提升+Lxc逃逸权限提升

信息收集 IP AddressOpening Ports192.168.101.149TCP:22,113,139,445,8080 $ nmap -p- 192.168.101.149 --min-rate 1000 -sC -sV PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 7.6p1 Ubuntu 4 (Ubuntu Linux; protocol 2.0) | ssh-hostkey: | …

Python基础语法篇(上)

Python基础语法&#xff08;上&#xff09; 一、基知二、基本数据类型&#xff08;一&#xff09;标准数据类型&#xff08;二&#xff09;数据类型转换 三、字符串基本操作&#xff08;一&#xff09;字符串的索引和切片&#xff08;二&#xff09;字符串的拼接 三、运算符四、…

51单片机嵌入式开发:11、 STC89C52RC 实现一个滑动的led点阵程序

STC89C52RC 实现一个滑动的led点阵程序 1 概述2 LED点阵介绍2.1 LED概述2.2 LED点阵注意事项 3 LED点阵原理3.1 Led点阵内部电路3.2 原理图电路 4 软件实现点阵图案的滑动4.1 软件工程代码4.2 Protues仿真 5 扩展74HC595&#xff08;后续专题开展&#xff09;6 总结 第十一节 1…

MySQL篇:主从复制

概述 话不多说&#xff0c;直接上概念&#xff1a; DDL&#xff08;Data Definition Language&#xff09;语句&#xff1a; 数据定义语言&#xff0c;主要是进行定义/改变表的结构、数据类型、表之间的链接等操作。常用的语句关键字有 CREATE、DROP、ALTER 等。 DML&#xff…

Redis实战—附近商铺、用户签到、UV统计

本博客为个人学习笔记&#xff0c;学习网站与详细见&#xff1a;黑马程序员Redis入门到实战 P88 - P95 目录 附近商铺 数据导入 功能实现 用户签到 签到功能 连续签到统计 UV统计 附近商铺 利用Redis中的GEO数据结构实现附近商铺功能&#xff0c;常见命令如下图所示。…

逻辑漏洞-支付漏洞

【实验目的】 通过本次实验&#xff0c;掌握最基础的支付漏洞 【实验环境】 win7操作机&#xff1a;10.0.0.2 centos7靶机&#xff1a;10.0.0.3 【实验步骤】 1. 启动实验环境 点击“启动场景”按钮&#xff0c;成功启动后&#xff0c;点击操作机按钮进入操作界面。 打开浏…

景区客流统计系统提升服务精准度

在当今旅游业蓬勃发展的时代&#xff0c;景区面临着越来越多的挑战和机遇。如何在保障游客良好体验的同时&#xff0c;实现景区的高效管理和可持续发展&#xff0c;成为了摆在景区管理者面前的重要课题。景区客流统计系统的出现&#xff0c;为解决这一问题提供了有力的支持&…

如何通过成熟的外发平台,实现文档安全外发管理?

文档安全外发管理是企业信息安全管理的重要组成部分&#xff0c;它涉及到企业向外发送的文件&#xff0c;需要进行严格的控制和管理&#xff0c;防止敏感或机密信息的泄露。以下是一些关键考虑因素&#xff1a; 文件外发的挑战&#xff1a;企业在文件外发时面临的主要挑战包括…

Python数据分析-植物生长数据分析(机器学习模型和神经网络模型)

一、研究背景 植物生长受多种环境因素的影响&#xff0c;包括土壤类型、日照时间、浇水频率、肥料类型、温度和湿度等。这些因素不仅影响植物的生长速度和健康状况&#xff0c;还对植物在不同生长阶段的表现有显著影响。随着气候变化和环境污染问题的加剧&#xff0c;研究如何…

【NLP实战】基于TextCNN的新闻文本分类

TextCNN文本分类在pytorch中的实现 基于TextCNN和transformers.BertTokenizer的新闻文本分类实现&#xff0c;包括训练、预测、数据加载和准确率评估。 目录 项目代码TextCNN网络结构相关模型仓库准备工作项目调参预测与评估 1.项目代码 https://github.com/NeoTse0622/Te…

数电基础 - 硬件描述语言

目录 一. 简介 二. Verilog简介和基本程序结构 三. 应用场景 四. Verilog的学习方法 五.调式方法 一. 简介 硬件描述语言&#xff08;Hardware Description Language&#xff0c;HDL&#xff09;是用于描述数字电路和系统的形式化语言。 常见的硬件描述语言包括 VHDL&…

如何落地实际场景,解决跨境传输共性需求?免费白皮书可下载

在全球化的背景下&#xff0c;海外市场对于数据驱动的产品和服务的需求不断增加&#xff0c;各行业数据跨境传输也日趋频繁&#xff0c;在这种前景下&#xff0c;越来越多的企业寻求更深度的跨国业务及合作&#xff0c;因此&#xff0c;企业数据跨境流动也成为了势不可挡的趋势…

LabVIEW异步和同步通信详细分析及比较

1. 基本原理 异步通信&#xff1a; 原理&#xff1a;异步通信&#xff08;Asynchronous Communication&#xff09;是一种数据传输方式&#xff0c;其中数据发送和接收操作在独立的时间进行&#xff0c;不需要在特定时刻对齐。发送方在任何时刻可以发送数据&#xff0c;而接收…

Internet 控制报文协议 —— ICMPv4 和 ICMPv6 详解

ICMP 是一种面向无连接的协议&#xff0c;负责传递可能需要注意的差错和控制报文&#xff0c;差错指示通信网络是否存在错误 (如目的主机无法到达、IP 路由器无法正常传输数据包等。注意&#xff0c;路由器缓冲区溢出导致的丢包不包括在 ICMP 响应范围内&#xff0c;在 TCP 负责…

[C++]——同步异步日志系统(6)

同步异步日志系统 一、日志器模块设计1.1 同步日志器模块设计1.1.1 局部日志器建造者模式设计1.1.2 同步日志器基本功能测试 1.2 异步日志器模块设计1.2.1 单缓冲区设计1.2.2 异步工作线程的设计&#xff08;双缓冲区思想&#xff09;1.2.3 异步日志器设计1.2.4 异步日志器建造…

5.串口通信

文章目录 串口的介绍TTLRS-232RS-485 分类方式串口并口同步异步 相关寄存器SCONPCONTMODSBUFIE 中断处理函数代码编写main.cdelay.cdelay.hUart.cUart.hmain.h回环 继电器ESP8266AT指令代码编写main.cdefine.cdefine.hsend.csend.hreceive.cdelay.cdelay.h 串口的介绍 UART&am…

项目发布部署:如何发布.NETCore项目到IIS服务器?

前言&#xff1a;本文将详细介绍如何发布.NET Core项目到IIS服务器。首先&#xff0c;第一步需要安装IIS&#xff0c;介绍了在本地电脑和服务器中进行安装。然后需要安装SDK和运行时才能发布.NETCore项目。其次介绍了如何发布.NETCore项目和Vue项目&#xff0c;并配置IIS。最后…

自适应键盘,自带隐藏键盘的输入框(UITextField)

引言 在iOS开发中&#xff0c;输入框占据着举足轻重的地位。与安卓不同&#xff0c;iOS输入框经常面临键盘遮挡的问题&#xff0c;或者无法方便地取消键盘。为了解决这些问题&#xff0c;有许多针对iOS键盘管理的库&#xff0c;如IQKeyboardManager、TPKeyboardAvoiding和Keyb…

数仓实践:维度建模标准规范定义

一、引言 指以维度建模作为理论基础,构建总线矩阵,划分和定义数据域、业务过程、维度、度量/原子指标、业务限定、时间周期、统计粒度、派生指标。 规范定义如下: 二、名词术语 名词解释数据域面向业务分析,将业务过程或者维度进行抽象的集合。其中,业务过程可以概括为…

idea中使用maven

默认情况下&#xff0c;idea会自动下载并安装maven&#xff0c;这不便于我们管理。 最好是自行下载maven&#xff0c;然后在idea中指定maven的文件夹路径