SqlSugar 基础知识

news/2024/12/28 20:41:04/文章来源:https://www.cnblogs.com/lgx5/p/18442322

 

1、实体特性
[SugarColumn(IsPrimaryKey = true)] 标识是否为主键
[SugarColumn(IsIdentity = true)] 是否为自增长
[SugarColumn(ColumnName = "id")] 对应数据库表里面的某列
[SugarColumn(IsIgnore = true)] 忽略熟悉,在ORM会过滤掉
[SugarColumn(ColumnDescription = "创建时间")] 描述

[SugarTable("base_student")]
public class Student
{/// <summary>/// IsPrimaryKey 标识是否为主键/// IsIdentity 是否为自增长/// </summary>[SugarColumn(IsPrimaryKey = true, IsIdentity = true, ColumnName = "id")]public string Id { get; set; }/// <summary>/// 定义别名进来Mapping,对应数据库表里面的Remark列/// </summary>[SugarColumn(ColumnName = "student_name", ColumnDescription = "用户名")]public string Name { get; set; }/// <summary>/// IsIgnore 不做数据库操作,true将不会进行查询、添加等操作/// </summary>[SugarColumn(ColumnName = "created_time", IsIgnore = true, ColumnDescription = "创建时间")]public DateTime CreatedTime { get; set; } //这列在ORM会过滤掉
}

2、联合查询(一)

public List<MenuDo> GetListByRoleId(string roleId, string sid)
{var result = Context.db.Queryable<RoleMenuDo, MenuDo>((rm, m) => new object[]{JoinType.Left, rm.MenuId ==m.Id}).Where((rm, m) => rm.RoleId == roleId && rm.MenuType == 1&& rm.Status != "D" && rm.SchoolId == sid&& m.Status != "D" && m.SchoolId == sid).OrderBy((rm, m) => m.Sort, OrderByType.Desc).Select((rm, m) => new{Id = m.Id,MenuName = m.MenuName,ControllerName = m.ControllerName,ActionName = m.ActionName,Url = m.Url,ParentId = m.ParentId,Sort = m.Sort,Icon = m.Icon,}).ToList().Select(x => new MenuDo{Id = x.Id,//MenuType = item.MenuType,MenuName = x.MenuName,ControllerName = x.ControllerName,ActionName = x.ActionName,Url = x.Url,Icon = x.Icon,ParentId = x.ParentId,}).ToList();return result;
}

3、联合查询(二)

var result1 = Context.db.Queryable<ClassDo, GradeDo>((c, g) => new object[]{ JoinType.Left, c.GradeId == g.Id }).Where((c, g) => c.SchoolId == sid && c.Status != "D" && g.SchoolId == sid && g.Status != "D").WhereIF(string.IsNullOrEmpty(name), (c, g) =>c.ClassName.Contains(name) || c.ClassCode.Contains(name) || g.GradeName.Contains(name) || g.GradeCode.Contains(name)).Select<ClassViewModel>().ToPageList(pageIndex, pageSize, ref total);

4、联合查询 - 简化

public Equipment GetModelByID(string id, string sid)
{var result = Context.db.Queryable<Equipment, Dormitory>((e, d) => e.DormitoryId == d.Id).Where((e, d) => e.SchoolId == sid && e.Status != "D" && d.SchoolId == sid && d.Status != "D").Select((e, d) => new Equipment{Id = e.Id,EquipmentCode = e.EquipmentCode,EquipmentName = e.EquipmentName,Location = e.Location,DormitoryId = e.DormitoryId,DormitoryName = d.DormitoryName,Mac = e.Mac,Ip = e.Ip,InOutType = e.InOutType,Describe = e.Describe,Sort = e.Sort,}).First();return Mapper.Map<Equipment>(result);
}//2表查询
var list5 = db.Queryable<Student, School>((st, sc) => st.SchoolId == sc.Id).Select((st,sc)=>new {st.Name,st.Id,schoolName=sc.Name}).ToList();//3表查询
var list6 = db.Queryable<Student, School,School>((st, sc,sc2) => st.SchoolId == sc.Id&&sc.Id==sc2.Id).Select((st, sc,sc2) => new { st.Name, st.Id, schoolName = sc.Name,schoolName2=sc2.Name }).ToList();//3表查询分页
var list7= db.Queryable<Student, School, School>((st, sc, sc2) => st.SchoolId == sc.Id && sc.Id == sc2.Id)
.Select((st, sc, sc2) => new { st.Name, st.Id, schoolName = sc.Name, schoolName2 = sc2.Name }).ToPageList(1,2);

5、WHERE条件查询

var query = Context.SqlQueryable<StudentDto>(sql).Where(x => x.Status != "D").Where(x => grades.Select(g => new { GradeId = g.Id }).JoinAsString(",").Contains(x.GradeId)&& classes.Select(c => new { ClassId = c.Id }).JoinAsString(",").Contains(x.ClassId)).WhereIF(request.SchoolId.HasValue(), x => x.SchoolId == request.SchoolId).WhereIF(request.ClassId.HasValue(), x => x.ClassId == request.ClassId).WhereIF(request.GradeId.HasValue(), x => x.GradeId == request.GradeId).WhereIF(request.Search.HasValue(), x => x.StudentName == request.Search || x.StudentCode== request.Search).WhereIF(request.NameOrCode.HasValue(),x => x.StudentName.Contains(request.NameOrCode) || x.StudentCode.Contains(request.NameOrCode));

Between ... AND ...

db.Queryable<Student>().Where(it => SqlFunc.Between(it.Id, 1, 20)).ToList();

6、Insert 新增 批量插入

var insertData = new course() { };//测试参数
var insertArray = new course[] { insertData };
courseDb.Insert(insertData);//插入
courseDb.InsertRange(insertArray);//批量插入
var id = courseDb.InsertReturnIdentity(insertData);//插入返回自增列
courseDb.AsInsertable(insertData).ExecuteCommand();//我们可以转成 Insertable实现复杂插入
var insertObjs = new List<Student>(); //批量插入
var s9 = db.Insertable(insertObjs.ToArray()).ExecuteCommand();
//注意 : SqlSever 建表语句带有Wtih(设置),如果设置不合理,可能会引起慢,把With删掉就会很快

7、Update 修改

var updateData = new course() {  };//测试参数
var updateArray = new course[] { updateData };//测试参数
courseDb.Update(updateData);//根据实体更新
courseDb.UpdateRange(updateArray);//批量更新
// 只更新Name列和CreateTime列,其它列不更新,条件id=1
//courseDb.Update(it => new course() { Name = "a", CreateTime = DateTime.Now }, it => it.id==1);
courseDb.AsUpdateable(updateData).ExecuteCommand();

8、删除

var deldata = new course() {  };//测试参数
courseDb.Delete(deldata);//根据实体删除
courseDb.DeleteById(1);//根据主键删除
courseDb.DeleteById(new int[] { 1,2});//根据主键数组删除
courseDb.Delete(it=>1==2);//根据条件删除
courseDb.AsDeleteable().Where(it=>1==2).ExecuteCommand();//转成Deleteable实现复杂的操作

9、MySQL 存储过程

-- ----------------------------
-- Procedure structure for delete_data
-- ----------------------------
DROP PROCEDURE IF EXISTS `delete_data`;
DELIMITER ;;
CREATE DEFINER=`root`@`%` PROCEDURE `delete_data`(in sid VARCHAR(36))
BEGINDELETE FROM base_grade WHERE school_id=sid;DELETE FROM sys_user_info WHERE school_id=sid AND (mobile IS NULL OR mobile != 'admin');SET @adminId = '';SELECT @adminId := id FROM sys_user_info WHERE school_id=sid AND mobile = 'admin';DELETE FROM sys_user_role WHERE school_id=sid and user_id != @adminId;
END;;
DELIMITER ;

10、事务
10.1、无数据返回只返回状态

var result = Context.db.Ado.UseTran(() =>
{#region//Context.db.Deleteable<GradeDo>(x => x.SchoolId == grades[0].SchoolId).ExecuteCommand();//Context.db.Deleteable<ClassDo>(x => x.SchoolId == grades[0].SchoolId).ExecuteCommand();#endregion#region 执行存储过程删除Context.db.Ado.UseStoredProcedure().GetDataTable("proc_data_delete", new { sid = grades[0].SchoolId });#endregionif (grades != null && grades.Count > 0)Context.db.Insertable(grades.ToArray()).ExecuteCommand();if (classes != null && classes.Count > 0)Context.db.Insertable(classes.ToArray()).ExecuteCommand();
});
// result.ErrorException
// result.IsSuccess

10.2、返回数据并且返回状态

var result2 = db.Ado.UseTran<List<Student>>(() =>
{return db.Queryable<Student>().ToList();
});
// result.ErrorException
// result.IsSuccess
// result.Data

10.3、使用try catch来处理事务,用这种方式事务一定要加try catch回滚不然会锁表,在操作就卡死

try
{Context.db.Ado.BeginTran();#region 方式1//Context.db.Deleteable<GradeDo>(x => x.SchoolId == grades[0].SchoolId).ExecuteCommand();//Context.db.Deleteable<ClassDo>(x => x.SchoolId == grades[0].SchoolId).ExecuteCommand();#endregion#region 执行存储过程删除Context.db.Ado.UseStoredProcedure().GetDataTable("proc_data_delete", new { sid = grades[0].SchoolId });#endregionif (grades != null && grades.Count > 0)Context.db.Insertable(grades.ToArray()).ExecuteCommand();if (classes != null && classes.Count > 0)Context.db.Insertable(classes.ToArray()).ExecuteCommand();if (dormitorys != null && dormitorys.Count > 0)Context.db.Insertable(dormitorys.ToArray()).ExecuteCommand();Context.db.Ado.CommitTran();
}
catch (Exception)
{Context.db.Ado.RollbackTran();throw;
}
return true;

11、排序

db.Queryable<teacher>().OrderBy("sort desc")db.Queryable<teacher>()
.OrderBy(it => it.Id) //asc
.OrderBy(it => it.Name, OrderByType.Desc) //desc
.ToList()

 



 

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

为什么一定要学习正则表达式

为什么一定要学正则表达式 前言 为什么有正则表达式,以及为什么一定要学习正则表达式? 本文不去讨论正则表达式的历史,流派以及完整而复杂的用法,仅仅通过一个简单的搜索场景,把你带入正则表达式的世界,从此你将感受到“海阔凭鱼跃、天高任鸟飞”的痛快!,回归正题,假设…

Notepad--特色功能:拷贝另存为

Notepad--特色功能:拷贝另存为 你是否纠结如下的使用场景:正在编辑的文件,还没有想好,保存担心把原文件给覆盖了。 使用“另存为”后当前编辑界面的文档又变成新的文件了,可是你还想继续在原文件上工作,还得再打开原文件。咋办? 你会新建一个文档,把当前的内容拷贝一份…

Paper Reading: Deep balanced cascade forest: An novel fault diagnosis method for data imbalance

本文基于级联森林提出了一种用于不平衡故障检测数据集的模型 DBCF,该模型设计了优化的级联随机森林,从数据层面和算法层面改进不平衡学习。首先提出了一种新的多通道级联旋转机械故障诊断框架,该框架将数据级方法和算法级方法相结合。然后提出了一种混合采样方法,通过生成新…

AtCoder Beginner Contest 371(ABCDE)

A 个人直接硬解,讨论情况也并不复杂 代码: #include<bits/stdc++.h> #define int long long using namespace std; const int N=1e6+10; void solve() {char a, b, c;cin >> a >> b >> c;if (a == <) {if (c == <) {cout << "B&quo…

python 敏感词识别处理

定义词库 1、敏感词库(black_word.txt) 2、jeiba 分词库(jieba_db_file.txt) (我这简单的就用文本来记录了,可以将这些词库都通过数据库来存储,对企业来说通过可视化页面去增删改可能会更方便运营处理)代码示例 import os import jiebablack_word_list = list()def load_word…

刷题系统重构--添加vip功能

c端系统往往都具有vip功能作为主要盈利点,那咱们的刷题微服务系统肯定也该有,但是系统设计的时候就没有vip系统,今天构思了一下把原有代码重构了一下, 首先,根据原料的题目表建一张vip题目表,可以用来只存储vip题目,或者01区分vip题目,重构了一下新增题目,加了一项添加…

Winform控件优化之圆角按钮【各种实现中的推荐做法】

简介: Windows 11下所有控件已经默认采用圆角,其效果更好、相对有着更好的优化...尝试介绍很常见的圆角效果,通过重写控件的OnPaint方法实现绘制,并在后面进一步探索对应的优化和可能的问题Windows 11下所有控件已经默认采用圆角,其效果更好、相对有着更好的优化,只是这是…

Windows 中的硬链接、目录联接(软链接)、符号链接、快捷方式

在Linux文件系统中经常提及硬链接(Hard Link)和符号链接(Symbolic Link),Windows中也可以创建链接,但由于丰富的图形界面操作,很少提及链接。Windows 的 NTFS 文件系统支持三种链接:硬链接(Hard Link)、符号链接(Symbolic Link)和目录链接(junction point),此外还有一个大…

ehviewer绿色版1.9.5.2最新2024ios苹果安卓

随着科技的不断发展,手机已经成为我们生活中不可或缺的一部分。在这个数字化时代,人们对于娱乐方式的需求也在逐渐改变。其中,漫画作为一种受欢迎的阅读形式,已经从传统的纸质书籍转变为数字版。而今天,我要为大家介绍的这款软件——ehviewer绿色版1.9.5.2,正是为了满足广…

建筑中的文化表达与地方特色:演绎地域之魂

在浩瀚的城市风貌中,每一座建筑都是文化的载体,无声地讲述着地域的故事与精神。建筑不仅需要满足功能需求,更应成为文化传承与创新的舞台。本文旨在深度剖析建筑设计如何在尊重与弘扬地方文化的基础上,巧妙融合现代元素,创造出既有时代感又不失根源性的建筑作品。 1. 深入…

确保 PbootCMS 网站能够正常运行,并且成功安装和授权模板

准备 PHP 环境确认 PHP 版本使用命令行或 SSH 登录服务器,运行以下命令检查 PHP 版本:shphp -v确认版本为 5.3+。上传 PbootCMS 文件使用 FTP 客户端使用 FTP 客户端(如 FileZilla、WinSCP 等)连接到服务器。 将 PbootCMS 的所有文件上传到服务器的根目录(通常是 public_h…

解决 PbootCMS 网站程序提示“执行 SQL 发生错误

步骤一:清理缓存文件打开 FTP 客户端使用常用的 FTP 客户端(如 FileZilla、WinSCP 等)连接到服务器。找到 runtime 文件夹在 FTP 客户端中找到 PbootCMS 的安装目录,通常是在 public_html 或 www 目录下。删除 runtime 文件夹中的内容进入 runtime 文件夹,删除其中的所有文…