- 本文所述开发环境:.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”);