- 本文所述开发环境:.C#、NET8、Visual Studio2022
SqlSugar无实体查询数据表
首先根据《SqlSugar使用DbFirst对象根据数据库表结构创建实体类-C#》中的描述新建好对应的数据库表
通过《SqlSugar有实体CURD应用-C#》中,已经知道SqlSugar在有实体的情况下的基本使用方式。本文要讲述的是如何在没有实体类的情况下SqlSugar如何操作数据库表。也就是说,不用创建数据库表所对应的实体类,SqlSugar也是可以操作数据库的,这种更人性话,个人感觉更适合与项目开发。
以下还是通过将对应的 sql 语句转换为 SqlSugar 的语法方式经行讲解。了解更多可以查看SqlSugar官网。
这里再啰嗦一句:为了可以直观的看到SqlSugar语法最终执行的sql语句,可以使用如下代码,将Sql语句输出到控制台,调试的时候用的较多。
using (SqlSugarClient sugarClient = new(connectionConfig))
{sugarClient.Aop.OnLogExecuting = (s, p) =>{Console.WriteLine("===================================");Console.WriteLine($"Sql语句:{ s }");};// 接下来编辑执行的SqlSugar代码
}
1. 单表查询
- 查询 tb_student表中的数据
Sql语句:select * from tb_student
代码如下:DataTable student = sugarClient.Queryable<object>() // Object 表名实体类未知,无实体类.AS("tb_student") // 指定要查询的表名.ToDataTable(); // DataTable类型接收
由上看出,无实体其实就是将有实体时的实体类名换成object类型,然后用 .AS() 方法指定相应的表名就可以了,其它和有实体时类似。
Sql语句:select count(*) from tb_student
代码如下:int nCount = sugarClient.Queryable<object>().AS("tb_student").Count();
Sql语句:select top 1 * from tb_student
代码如下:DataTable student = sugarClient.Queryable<object>().AS("tb_student").Take(1).ToDataTable();
Sql语句:select top 10 * from tb_student
代码如下:DataTable student = sugarClient.Queryable<object>().AS("tb_student").Take(10) //和其它方法连用时, Task() 方法放在最后.ToDataTable();
Sql语句:select * from tb_student order by [年龄] asc ,[身高] desc
代码如下:DataTable studentDT = sugarClient.Queryable<object>().AS("tb_student").OrderBy("年龄, 身高 DESC").ToDataTable();
Sql语句:select 姓名,性别 from tb_student where 班级ID=1003 and 身高>165
代码如下:DataTable studentDT = sugarClient.Queryable<object>().AS("tb_student").Where("班级ID=1003").Where("身高>165").Select("姓名, 性别").ToDataTable(); //或者 DataTable studentDT = sugarClient.Queryable<object>().AS("tb_student").Where("班级ID = @classid and 身高 > @high", new { classid = 1003, high = 165 }).Select("姓名, 性别").ToDataTable();
Sql语句:select * from tb_subject_selection where 课程 like ‘%化学%’
代码如下:DataTable studentDT = sugarClient.Queryable<object>().AS("tb_subject_selection").Where("课程 like '%化学%'").ToDataTable();
Sql语句:select * from tb_student where 状态ID in (2, 3)
代码如下:DataTable studentDT = sugarClient.Queryable<object>().AS("tb_student").Where("状态ID in (2, 3)").ToDataTable(); //或者 DataTable studentDT = sugarClient.Queryable<object>().AS("tb_student").Where("状态ID in (@statuslist)", new { statuslist = new[] { 2, 3 } }).ToDataTable();
Sql语句:select 学生ID as Id, 姓名 as Name, 班级ID as Class from tb_student
代码如下:DataTable studentDT = sugarClient.Queryable<object>().AS("tb_student") // 指定要查的表名.Select("学生ID as Id, 姓名 as Name, 班级ID as Class") // 指定表字段别名.ToDataTable();
2. 多表查询
Sql语句:select 班级名称, 姓名 as 班主任 from tb_class a left join tb_teacher b on a.班主任 = b.教师ID
代码如下:DataTable dt = sugarClient.Queryable<object>().AS("tb_class", "c").AddJoinInfo("tb_teacher", "t", ObjectFuncModel.Create("Equals", "c.班主任", "t.教师ID"), JoinType.Left).Select("c.班级名称, t.姓名 as 班主任").ToDataTable();
RightJoin与LeftJoin一样,两个表以上的联合查询也类似,不断的连接起来就可以了。
3. 也可以直接执行组织好的sql语句
如果多表联合查询的语句比较复杂,那么就可以先组织好复杂的语句,然后使用SqlSugar直接执行就可以了。
Sql语句:select c.姓名,c.性别, c.班级名称, d.状态名称 from
(select a.姓名,a.性别,a.状态ID ,b.班级名称 from tb_student a left join tb_class b on a.班级ID=b.班级ID) c
left join tb_status d on c.状态ID = d.状态ID代码如下:
string strSql = "select c.姓名,c.性别, c.班级名称, d.状态名称 from " +"(select a.姓名,a.性别,a.状态ID ,b.班级名称 from tb_student a left join tb_class b on a.班级ID=b.班级ID) c " +"left join tb_status d on c.状态ID = d.状态ID";DataTable dt = sugarClient.Queryable<object>("s") //指定别名.AS($"({strSql})") // 这里的语句要用括号括起来.ToDataTable();
SqlSugar无实体增加表中数据
- 向表tb_student中插入一行新的记录
代码如下
var dc = new Dictionary<string, object>()
{{ "教师ID", "566" },{ "姓名", "何老师" },{ "性别", "男" },{ "联系方式", "15689760425" }
};sugarClient.Insertable(dc).AS("tb_teacher").ExecuteCommand();// 或者
sugarClient.InsertableByDynamic(new {教师ID = 567,姓名 = "夏老师",性别 = "女",联系方式 = "13723457890"}
).AS("tb_teacher").ExecuteCommand();
- 批量插入多条数据
要插入多条数据的话,将上面的Dictionary<string, object> 换成**List<Dictionary<string, object>>**就可以了。
SqlSugar无实体更新表中数据
- 更新表中单个字段
Sql语句:update tb_student set 班级ID=1001 where 学生ID=109
代码如下:sugarClient.Updateable<object>().AS("tb_student").SetColumns("班级ID", 1001).Where("学生ID = 109").ExecuteCommand(); // 或者 //字典更新单挑记录 var dt = new Dictionary<string, object>(); dt.Add("教师ID", 567); dt.Add("性别", "男"); sugarClient.Updateable(dt).AS("tb_teacher").WhereColumns("教师ID") // 指定相等的条件字段名.ExecuteCommand();
- 跟新表中多个字段
Sql语句:update tb_student set 班级ID=1001, 状态ID=3 where 学生ID=109
代码如下:sugarClient.Updateable<object>().AS("tb_student").SetColumns("班级ID", 1001).SetColumns("状态ID", 3).Where("学生ID = 109").ExecuteCommand(); // 或者 var dt = new Dictionary<string, object>(); dt.Add("教师ID", 567); dt.Add("性别", "女"); var dtList = new List<Dictionary<string, object>>(); dtList.Add(dt); sugarClient.Updateable(dtList).AS("tb_teacher").WhereColumns("教师ID").ExecuteCommand();
SqlSugar无实体删除表中数据
- 删除符合条件的记录
Sql语句:delete from tb_student where 学生ID=120
代码如下:sugarClient.Deleteable<object>().AS("tb_student").Where("学生ID=109").ExecuteCommand(); // 也可以用上面的字典进行删除,约束条件仍然是用 WhereColumns()。
- 清空表记录
Sql语句:truncate table tb_student
代码如下sugarClient.DbMaintenance.TruncateTable("tb_student");
- 判断一个表是否存在
bool exist = sugarClient.DbMaintenance.IsAnyTable(“tb_student”);