当前位置:   article > 正文

国产精品ORM框架-SqlSugar详解 SqlSugar初识 附案例源码 云草桑 专题一

国产精品ORM框架-SqlSugar详解 SqlSugar初识 附案例源码 云草桑 专题一
国产精品ORM框架-SqlSugar详解
1、SqlSugar初识
2、开始实操
3、增删改操作
4、进阶功能
5、集成整合
6、脚手架应用

sqlsugar 官网-CSDN博客

国产精品ORM框架-SqlSugar详解 SqlSugar初识 专题二-CSDN博客

1、SqlSugar初识

1.1 基本概念和历史

SqlSugar 是一款 老牌 .NET 开源ORM框架,由果糖大数据科技团队维护和更新 ,开箱即用
最易上手的ORM框架 。
ORM框架:以面向对象的思想去操作数据库的框架。

1.2 SqlSugar支持功能

支持 .NET 百万级【大数据】写入和更新、分表和几十亿查询和统计等 拥有成熟方案
支持 完整的SAAS一套应用 跨库查询 、租户分库 、租户分表 和 租户数据隔离
支持【低代码】+工作流 (无实体多库兼容CRUD & JSON TO SQL )
语法最爽的ORM、优美的表达式、仓储、UnitOfWork、DbContext、AOP `
支持 DbFirst、CodeFirst和【WebFirst】 3种模式开发
简单易用、功能齐全、高性能、轻量级、服务齐全、官网教程文档、有专业技术支持一天18小时
服务

2、开始实操

2.0 如何学习?

1、执行数据库脚本,初始化数据库
2、使用vs链接数据库中,得到链接字符串
3、配置链接字符串到CustomConnectionConfig配置类中

2.1 环境要求

VS2022开发工具
DOTNET6平台 控制台程序
SQL Server
SqlSugar version:5.1.3.32

2.2、DbFirst快速上手

DbFrist:映射迁移方式,从数据库中把表生成实体对象,数据库先行。先把数据库设计好。直接生成
实体;
Nuget: SqlSugarCore
快速链接数据库操作数据库;
准备数据库--SqlSugarDb
准备数据库链接字符串
Data Source=3     1,14331\\MSSQLSERVER2014;Initial Catalog=ZhaoxiSqlSugarDb;User ID=sa;Password=   ;Encrypt=False
nuget引入程序集SqlSugarCor
配置SqlClient
生成实体
  1. ConnectionConfig connectionConfig = new ConnectionConfig()
  2. {
  3. ConnectionString = "Data Source=PC-202406030027;Initial Catalog=ZhaoxiSqlSugarDb;User ID=sa;Password=sa123",
  4. IsAutoCloseConnection = true,
  5. DbType = DbType.SqlServer
  6. };
  7. //SqlSugarClient:链接数据库的对象
  8. using (SqlSugarClient db = new SqlSugarClient(connectionConfig))
  9. {
  10. //参数1:路径 参数2:命名空间
  11. //IsCreateAttribute 代表生成SqlSugar特性
  12. {
  13. db.DbFirst.IsCreateAttribute().CreateClassFile("E:\\zhaoxi\\gongkaike\\Zhaoxi.DotNet.Demo\\Zhaoxi.SqlSugar.Models", "Models");
  14. }
  15. //格式化文件名
  16. {
  17. db.DbFirst.FormatFileName(x => x.ToLower()).CreateClassFile("E:\\zhaoxi\\gongkaike\\Zhaoxi.DotNet.Demo\\Zhaoxi.SqlSugar.Models");
  18. }
  19. //强制可以空类型string加上?
  20. {
  21. db.DbFirst.StringNullable().CreateClassFile("E:\\zhaoxi\\gongkaike\\Zhaoxi.DotNet.Demo\\Zhaoxi.SqlSugar.Models");
  22. }
  23. //生成实体并且带有筛选
  24. {
  25. db.DbFirst.Where("Student").CreateClassFile("E:\\zhaoxi\\gongkaike\\Zhaoxi.DotNet.Demo\\Zhaoxi.SqlSugar.Models", "Models");
  26. db.DbFirst.Where(it => it.ToLower().StartsWith("snow")).CreateClassFile("E:\\zhaoxi\\gongkaike\\Zhaoxi.DotNet.Demo\\Zhaoxi.SqlSugar.Models", "Models");
  27. db.DbFirst.Where(it => it.ToLower().StartsWith("view")).CreateClassFile("E:\\zhaoxi\\gongkaike\\Zhaoxi.DotNet.Demo\\Zhaoxi.SqlSugar.Models", "Models");
  28. }
  29. //生成带有SqlSugar特性的实体
  30. {
  31. db.DbFirst.IsCreateAttribute().CreateClassFile("E:\\zhaoxi\\gongkaike\\Zhaoxi.DotNet.Demo\\Zhaoxi.SqlSugar.Models", "Models");
  32. }
  33. //生成实体带有默认值
  34. {
  35. db.DbFirst.IsCreateDefaultValue().CreateClassFile("E:\\zhaoxi\\gongkaike\\Zhaoxi.DotNet.Demo\\Zhaoxi.SqlSugar.Models", "Demo.Models");
  36. }
  37. //自定义格式化功能
  38. {
  39. db.DbFirst //类
  40. .SettingClassTemplate(old => { return old;/*修改old值替换*/ }) //类构造函数
  41. .SettingConstructorTemplate(old => { return old;/*修改old值替换*/ })
  42. .SettingNamespaceTemplate(old =>
  43. {
  44. return old + "\r\nusing SqlSugar;"; //追加引用SqlSugar
  45. })
  46. .SettingPropertyDescriptionTemplate(old => { return old;/*修改old值替换*/}) //属性备注
  47. .SettingPropertyTemplate((columns, temp, type) => //属性:新重载 完全自定义用配置
  48. {
  49. var columnattribute = "\r\n [SugarColumn({0})]";
  50. List<string> attributes = new List<string>();
  51. if (columns.IsPrimarykey)
  52. attributes.Add("IsPrimaryKey=true");
  53. if (columns.IsIdentity)
  54. attributes.Add("IsIdentity=true");
  55. if (attributes.Count == 0)
  56. {
  57. columnattribute = "";
  58. }
  59. return temp.Replace("{PropertyType}", type)
  60. .Replace("{PropertyName}", columns.DbColumnName)
  61. .Replace("{SugarColumn}", string.Format(columnattribute, string.Join(",", attributes)));
  62. })
  63. .CreateClassFile("E:\\zhaoxi\\gongkaike\\Zhaoxi.DotNet.Demo\\Zhaoxi.SqlSugar.Models");
  64. }

//格式化文件名
//生成带有SqlSugar特性的实体
自定义格式化功能

2.3、CodeFirst快速上手

代码先行,先有代码,然后有数据库,只关注业务,业务中的对象如果需要就直接创建实体,对应的数
据库表,由代码一次生成;
准备实体对象
准备数据库链接字符串
nuget引入程序集SqlSugarCore
配置SqlClient
生成数据库和表
数据库的结构完全由代码来决定,数据库表--主键、自增,字段类型。。。。。
特性列表 ---用在类的属性---对应的是数据库中的表的某一个字段
名称 描述
IsIdentity 是否创建自增标识
IsPrimaryKey 是否创建主键标识
ColumnName 创建数据库字段的名称(默认取实体类属性名称)
ColumnDataType
创建数据库字段的类型用法1: “varchar(20)” 不需要设置长度用
法2: 不设置该参数 系统会根据C#类型自动生成相应的数据库类型 用
法3: 多库兼容可以用 :看标题9
IsIgnore ORM不处理该列
ColumnDescription 备注 表注释 (新版本支持XML文件)
Length 长度 设成10会生成 xxx类型(10), 没括号的不设置
IsNullable 是否可以为null默为false
DecimalDigits 精度 如 decimal(18,2) length=18,DecimalDigits=2
OracleSequenceName 设置Oracle序列,设置后该列等同于自增列
OldColumnName 修改列名用,这样不会新增或者删除列
IndexGroupNameList 创建索引用
UniqueGroupNameList 创建唯一索引
注意:有2个属性用处不
同DefaultValue
IsOnlyIgnoreInsert
DefaultValue=默认值 用来建表设置字段默认值
IsOnlyIgnoreInsert=true 插入数据时取默认值很多情况需要2个一
起使用如果只建表不插入数据用1个 如果建表并且插入数据用2个
  1. /// <summary>
  2. /// CodeFirst
  3. /// </summary>
  4. public static void CodeFirstShow()
  5. {
  6. ConnectionConfig connectionConfig = new ConnectionConfig()
  7. {
  8. ConnectionString =
  9. IsAutoCloseConnection = true,
  10. DbType = DbType.SqlServer
  11. };
  12. using (SqlSugarClient db = new SqlSugarClient(connectionConfig))
  13. {
  14. //如果不存在创建数据库存在不会重复创建
  15. {
  16. db.DbMaintenance.CreateDatabase(); // 注意 :Oracle和个别国产库需不支持该方法,需要手动建库
  17. }
  18. //创建表根据实体类CodeFirstTable1
  19. {
  20. db.CodeFirst.InitTables(typeof(CodeFirstTable1));//这样一个表就能成功创建了
  21. }
  22. //创建单个表
  23. {
  24. db.CodeFirst.SetStringDefaultLength(200).InitTables(typeof(CodeFirstTable1));//这样一个表就能成功创建了
  25. }
  26. //手动建多个表
  27. {
  28. db.CodeFirst
  29. .SetStringDefaultLength(200)
  30. .InitTables(typeof(CodeFirstTable1), typeof(CodeFirstTable2));
  31. }
  32. //批量创建表
  33. //语法1:
  34. {
  35. Type[] types = Assembly
  36. .LoadFrom("Zhaoxi.SqlSugar.Models.dll")//如果 .dll报错,可以换成 xxx.exe 有些生成的是exe
  37. .GetTypes().Where(it => it.FullName.Contains("CodeFirst"))//命名空间过滤,当然你也可以写其他条件过滤
  38. .ToArray();//断点调试一下是不是需要的Type,不是需要的在进行过滤
  39. //判断如果数据库存在这个表,就删除表
  40. foreach (Type type in types)
  41. {
  42. if (db.DbMaintenance.IsAnyTable(type.Name, false))
  43. {
  44. db.DbMaintenance.DropTable(type.Name);
  45. }
  46. }
  47. //然后创建
  48. db.CodeFirst.SetStringDefaultLength(200).InitTables(types);//根据types创建表
  49. }
  50. //语法2:
  51. {
  52. Type[] types = typeof(CodeFirstTable1).Assembly.GetTypes()
  53. .Where(it => it.FullName.Contains("CodeFirst"))//命名空间过滤,当然你也可以写其他条件过滤
  54. .ToArray();
  55. //判断如果数据库存在这个表,就删除表
  56. foreach (Type type in types)
  57. {
  58. if (db.DbMaintenance.IsAnyTable(type.Name, false))
  59. {
  60. db.DbMaintenance.DropTable(type.Name);
  61. }
  62. }
  63. db.CodeFirst.SetStringDefaultLength(200).InitTables(types);//根据types创建表
  64. }
  65. //动态设置表名
  66. {
  67. db.CodeFirst.As<UnituLong>("UnituLong0011").InitTables<UnituLong>();
  68. }
  69. }
  70. }

特殊支持

如果大量使用 ColumnDataType="nvarchar(50)" 自定义类型将无法很好的支持多种数据库,比如很
多库不支持nvarchar
当然你也可以使用AOP替换 ColumnDataType 去实现多库,下面介绍自带的方案
  1. /// <summary>
  2. /// CodeFirst
  3. /// </summary>
  4. public static void CodeFirstShow()
  5. {
  6. ConnectionConfig connectionConfig = new ConnectionConfig()
  7. {
  8. ConnectionString = "Data Source=PC-202406030027;Initial Catalog=ZhaoxiSqlSugarDb_Info;Integrated Security=True",
  9. IsAutoCloseConnection = true,
  10. DbType = DbType.SqlServer
  11. };
  12. using (SqlSugarClient db = new SqlSugarClient(connectionConfig))
  13. {
  14. //如果不存在创建数据库存在不会重复创建
  15. {
  16. db.DbMaintenance.CreateDatabase(); // 注意 :Oracle和个别国产库需不支持该方法,需要手动建库
  17. }
  18. //创建表根据实体类CodeFirstTable1
  19. {
  20. db.CodeFirst.InitTables(typeof(CodeFirstTable1));//这样一个表就能成功创建了
  21. }
  22. //创建单个表
  23. {
  24. db.CodeFirst.SetStringDefaultLength(200).InitTables(typeof(CodeFirstTable1));//这样一个表就能成功创建了
  25. }
  26. //手动建多个表
  27. {
  28. db.CodeFirst
  29. .SetStringDefaultLength(200)
  30. .InitTables(typeof(CodeFirstTable1), typeof(CodeFirstTable2));
  31. }
  32. //批量创建表
  33. //语法1:
  34. {
  35. Type[] types = Assembly
  36. .LoadFrom("Zhaoxi.SqlSugar.Models.dll")//如果 .dll报错,可以换成 xxx.exe 有些生成的是exe
  37. .GetTypes().Where(it => it.FullName.Contains("CodeFirst"))//命名空间过滤,当然你也可以写其他条件过滤
  38. .ToArray();//断点调试一下是不是需要的Type,不是需要的在进行过滤
  39. //判断如果数据库存在这个表,就删除表
  40. foreach (Type type in types)
  41. {
  42. if (db.DbMaintenance.IsAnyTable(type.Name, false))
  43. {
  44. db.DbMaintenance.DropTable(type.Name);
  45. }
  46. }
  47. //然后创建
  48. db.CodeFirst.SetStringDefaultLength(200).InitTables(types);//根据types创建表
  49. }
  50. //语法2:
  51. {
  52. Type[] types = typeof(CodeFirstTable1).Assembly.GetTypes()
  53. .Where(it => it.FullName.Contains("CodeFirst"))//命名空间过滤,当然你也可以写其他条件过滤
  54. .ToArray();
  55. //判断如果数据库存在这个表,就删除表
  56. foreach (Type type in types)
  57. {
  58. if (db.DbMaintenance.IsAnyTable(type.Name, false))
  59. {
  60. db.DbMaintenance.DropTable(type.Name);
  61. }
  62. }
  63. db.CodeFirst.SetStringDefaultLength(200).InitTables(types);//根据types创建表
  64. }
  65. //动态设置表名
  66. {
  67. db.CodeFirst.As<UnituLong>("UnituLong0011").InitTables<UnituLong>();
  68. }
  69. }
  70. }

//创建表根据实体类CodeFirstTable1   

//创建单个表 
{
    db.CodeFirst.SetStringDefaultLength(200).InitTables(typeof(CodeFirstTable1));//这样一个表就能成功创建了
}

//批量创建表

//命名空间过滤,当然你也可以写其他条件过滤

//动态设置表名
{
    db.CodeFirst.As<UnituLong>("UnituLong0011").InitTables<UnituLong>();
}

2.4、索引支持

普通索引
唯一索引 (true表示唯一索引)
复合普通索引
给索引添加占位符 占位符 {table} {db}
  1. /// <summary>
  2. /// CodeFirst创建索引
  3. /// </summary>
  4. public static void CodeFirstIndexShow()
  5. {
  6. ConnectionConfig connectionConfig = new ConnectionConfig()
  7. {
  8. ConnectionString = "Data Source=PC-202406030027;Initial Catalog=ZhaoxiSqlSugarDb_NewInfo;Integrated Security=True",
  9. IsAutoCloseConnection = true,
  10. DbType = DbType.SqlServer
  11. };
  12. using (SqlSugarClient db = new SqlSugarClient(connectionConfig))
  13. {
  14. //创建表根据实体类CodeFirstTable3
  15. {
  16. db.CodeFirst.InitTables(typeof(CodeFirstTable3));//这样一个表就能成功创建了
  17. }
  18. }
  19. }
  1. [SugarIndex("index_codetable3_name", nameof(CodeFirstTable3.Name), OrderByType.Asc)] //普通索引--非聚集索引
  2. [SugarIndex("unique_codetable3_CreateTime", nameof(CodeFirstTable3.CreateTime), OrderByType.Desc, true)] //唯一索引 (true表示唯一索引)
  3. [SugarIndex("index_codetable3_nameid", nameof(CodeFirstTable3.Name), OrderByType.Asc, nameof(CodeFirstTable1.Id), OrderByType.Desc)] //复合普通索引
  4. [SugarIndex("{db}index_codetable3_name", nameof(CodeFirstTable3.Description), OrderByType.Asc)] //使用 {db} 进行占位符替换,小写不要有空格
  5. [SugarIndex("index_{table}_name", nameof(CodeFirstTable3.DescriptionNew), OrderByType.Asc)] //表名占位符(自动分表不需要加这个自动的)
  6. [SugarIndex("IndexUnituadfasf3_longx{include:name,id}", nameof(IndexUnituadfasf), OrderByType.Asc)]
  7. [SugarTable("CodeFirstTable3", TableDescription = "表备注")]//表添加备注
  8. public class CodeFirstTable3
  9. {
  10. [SugarColumn(IsIdentity = true, IsPrimaryKey = true)]
  11. public int Id { get; set; }
  12. public string? Name { get; set; }
  13. [SugarColumn(ColumnDataType = "Nvarchar(255)")]//custom
  14. public string? Text { get; set; }
  15. [SugarColumn(IsNullable = true)]
  16. public DateTime CreateTime { get; set; }
  17. [SugarColumn(ColumnDataType = "Nvarchar(255)")]//custom
  18. public string? Description { get; set; }
  19. [SugarColumn(ColumnDataType = "Nvarchar(255)")]//custom
  20. public string? DescriptionNew { get; set; }
  21. [SugarColumn(ColumnDataType = "Nvarchar(255)")]//custom
  22. public string? IndexUnituadfasf { get; set; }
  23. }

2.5、库表操作

名称 备注 返回
类型
GetDataBaseList 获取所有数据库名称 List
GetViewInfoList 查询所有视图 List
GetTableInfoList 获取所有表,查询所有的表
(GetTableInfoList(是否缓存)) List
GetColumnInfosByTableName 获取列根据表名,获取字段,字段信息
GetColumnInfosByTableName(表名,是否缓存) List
GetIsIdentities 获取自增列 List
GetPrimaries 获取主键 List
IsAnyTable 表是否存在,判断表存不存在 ( IsAny(表名,是否
缓存)) bool
IsAnyColumn 列是否存在 bool
IsPrimaryKey 主键是否存在 bool
IsIdentity 自增是否存在 bool
IsAnyConstraint 约束是否存在 bool
2.4、索引支持
普通索引
唯一索引 (true表示唯一索引)
复合普通索引
给索引添加占位符 占位符 {table} {db}
2.5、库表操作
名称 备注 返回
类型
DropTable 删除表 bool
TruncateTable 清空表 bool
CreateTable
创建表说明:如果有实体类优先用CodeFirst建
表,这个是底层方法用该方法建表,因为数据库不
同,有些属性需要用单纯写个方法去创建,当前表
格这些方法都有现成的
bool
AddColumn 添加列 bool
UpdateColumn 更新列 bool
AddPrimaryKey 添加主键 bool
DropConstraint 删除约束 bool
BackupDataBase 备份库 bool
DropColumn 删除列 bool
RenameColumn 重命名列 bool
AddDefaultValue 添加默认值 bool
AddTableRemark 添加表描述,表注释 bool
AddColumnRemark 添加列描述,表注释 bool
DeleteColumnRemark 删除列描述,表注释 bool
RenameTable 重命名表 bool
CreateIndex 创建索引 bool
IsAnyIndex 索引是否存在 bool
  1. using (SqlSugarClient db = new SqlSugarClient(connectionConfig))
  2. {
  3. Console.WriteLine("GetDataBaseList============================");
  4. foreach (var item in db.DbMaintenance.GetDataBaseList(db))
  5. {
  6. Console.WriteLine(item);
  7. }
  8. Console.WriteLine("GetViewInfoList============================");
  9. foreach (var item in db.DbMaintenance.GetViewInfoList(false))
  10. {
  11. Console.WriteLine(item);
  12. }
  13. Console.WriteLine("GetTableInfoList============================");
  14. foreach (var item in db.DbMaintenance.GetTableInfoList(false))
  15. {
  16. Console.WriteLine(item.Name);
  17. }
  18. Console.WriteLine("GetIsIdentities============================");
  19. foreach (var item in db.DbMaintenance.GetIsIdentities("CodeFirstTable3"))
  20. {
  21. Console.WriteLine(item);
  22. }
  23. Console.WriteLine("GetPrimaries============================");
  24. foreach (var item in db.DbMaintenance.GetPrimaries("CodeFirstTable3"))
  25. {
  26. Console.WriteLine(item);
  27. }
  28. if (db.DbMaintenance.IsAnyTable("CodeFirstTable3", false))
  29. {
  30. db.DbMaintenance.DropTable("CodeFirstTable3");
  31. }
  32. //db.DbMaintenance.DropTable("CodeFirstTable3");
  33. //.....
  34. }

3、增删改操作

3.1、数据插入数据库

插入 单条
字典插入 
忽略插入
批量 插入
雪花ID插入
Guid主键自动赋值 函数
注意 说明
插入返回值:
  1. using (SqlSugarClient db = new SqlSugarClient(connectionConfig))
  2. {
  3. db.CodeFirst.InitTables(typeof(Snowflake));
  4. db.CodeFirst.InitTables(typeof(Student));
  5. #region 单条插入
  6. {
  7. int count = db.Deleteable<Student>().ExecuteCommand();
  8. //插入返回自增列 (实体除ORACLE外实体要配置自增,Oracle需要配置序列)
  9. int idPk = db.Insertable(student).ExecuteReturnIdentity();
  10. //返回雪花ID 看文档3.0具体用法(在最底部)
  11. Snowflake snowflakeModel = new Snowflake()
  12. {
  13. Name = "返回雪花ID",
  14. SchoolId = 1
  15. };
  16. db.Deleteable<Snowflake>().ExecuteCommand();
  17. long id = db.Insertable(snowflakeModel).ExecuteReturnSnowflakeId();
  18. //实用技巧2: 强制设置表名(默认表名来自实体)
  19. db.Insertable(student).AS("dbstudent").ExecuteCommand();
  20. //字典插入
  21. Dictionary<string, object> dc = new Dictionary<string, object>();
  22. dc.Add("StudentName", "字典插入"); //不能写实体中的属性名,必须和数据库保持一致
  23. dc.Add("SchoolId", 23);
  24. dc.Add("CreateTime", DateTime.Now);
  25. db.Insertable(dc).AS("dbstudent").ExecuteCommand();
  26. db.Deleteable<Student>().ExecuteCommand();
  27. //匿名对象 插入
  28. var obj = new
  29. {
  30. StudentName = "匿名对象 插入",
  31. CreateTime = DateTime.Now,
  32. SchoolId = "456"
  33. };
  34. db.Insertable<Dictionary<string, object>>(obj).AS("[dbstudent]")
  35. .ExecuteCommand();
  36. }
  37. #endregion
  38. #region 忽略-不插入指定字段
  39. {
  40. db.Deleteable<Student>().ExecuteCommand();
  41. //忽略 name SchoolId
  42. int id = db.Insertable(student).IgnoreColumns(it => new { it.Name }).ExecuteReturnIdentity();
  43. db.Insertable(student).IgnoreColumns("Name", "SchoolId").ExecuteReturnIdentity();
  44. }
  45. #endregion
  46. #region 只插入指定字段
  47. {
  48. db.Deleteable<Student>().ExecuteCommand();
  49. //忽略 name testid
  50. int id = db.Insertable(student).InsertColumns(it => new { it.Name }).ExecuteReturnIdentity();
  51. db.Insertable(student).InsertColumns("Name", "SchoolId").ExecuteReturnIdentity();
  52. }
  53. #endregion
  54. #region 批量插入
  55. {
  56. db.Deleteable<Student>().ExecuteCommand();
  57. List<Student> addlist = new List<Student>();
  58. for (int i = 0; i < 100; i++)
  59. {
  60. addlist.Add(new Student()
  61. {
  62. Name = $"Name_{i}",
  63. SchoolId = i,
  64. CreateTime = DateTime.Now
  65. });
  66. }
  67. //(1)、非参数化插入(防注入)
  68. //优点:综合性能比较平均,列少1万条也不慢,属于万写法,不加事务情况下部分库有失败回滚机质
  69. //缺点:数据量超过5万以上占用内存会比较大些,内存小可以用下面2种方式处理
  70. db.Insertable(addlist).ExecuteCommand();
  71. //(2)、使用参数化内部分页插入
  72. //优点:500条以下速度最快,兼容所有类型和emoji,10万以上的大数据也能跑,就是慢些,内部分批量处理过了。
  73. //缺点:500以上就开始慢了,要加事务才能回滚
  74. db.Insertable(addlist).UseParameter().ExecuteCommand();//5.0.3.8-Preview及以上版本支持(NUGET搜索勾上包括预览)
  75. //(3)、大数据写入(特色功能:大数据处理上比所有框架都要快30%)
  76. //优点:1000条以上性能无敌手
  77. //缺点:不支持数据库默认值, API功能简单, 小数据量并发执行不如普通插入,插入数据越大越适合用这个
  78. //新功能 5.0.44
  79. db.Fastest<Student>().PageSize(100000).BulkCopy(addlist);
  80. }
  81. #endregion
  82. #region 分页插入
  83. {
  84. db.Deleteable<Student>().ExecuteCommand();
  85. List<Student> addlist = new List<Student>();
  86. for (int i = 0; i < 100; i++)
  87. {
  88. addlist.Add(new Student()
  89. {
  90. Name = $"Name_{i}",
  91. SchoolId = i,
  92. CreateTime = DateTime.Now
  93. });
  94. }
  95. //分页插入 ,如果不支持db.Fastest分页插入也是可以提升一下性能的
  96. db.Utilities.PageEach(addlist, 10, pageList =>
  97. {
  98. db.Insertable(pageList).ExecuteCommand();
  99. //db.Insertable(List<实体>).UseParameter().ExecuteCommand() 可以试试和上面哪个性能高用哪个
  100. });
  101. }
  102. #endregion
  103. #region 大数据插入
  104. {
  105. List<Student> students = new List<Student>();
  106. db.Deleteable<Student>().ExecuteCommand();
  107. for (int i = 0; i < 1000000; i++)
  108. {
  109. students.Add(new Student()
  110. {
  111. Name = $"Name_{i}",
  112. SchoolId = i,
  113. CreateTime = DateTime.Now
  114. });
  115. }
  116. //Stopwatch stopwatch = Stopwatch.StartNew();
  117. //stopwatch.Start();
  118. 插入 100万 数秒时间
  119. //db.Insertable<Student>(students).ExecuteCommand();//性能 比现有任何Bulkcopy都要快30%
  120. //stopwatch.Stop();
  121. //Console.WriteLine($"普通方式:1000000条数据大概用时:{stopwatch.ElapsedMilliseconds} 毫秒");
  122. db.Deleteable<Student>().ExecuteCommand();
  123. Stopwatch stopwatch1 = Stopwatch.StartNew();
  124. stopwatch1.Start();
  125. //插入 100万 数秒时间
  126. db.Fastest<Student>().BulkCopy(students);//性能 比现有任何Bulkcopy都要快30%
  127. stopwatch1.Stop();
  128. Console.WriteLine($"BulkCopy大数据操作:1000000条数据大概用时:{stopwatch1.ElapsedMilliseconds} 毫秒");
  129. }
  130. #endregion
  131. #region Guid主键自动赋值
  132. {
  133. //只要设置为主键,并且C#类型是Guid 只要不传值,会自动赋值
  134. // 注意只能用: ExecuteCommand 方法不能用自增列的方法
  135. db.CodeFirst.InitTables(typeof(UserInfo));
  136. db.Deleteable<UserInfo>().ExecuteCommand();
  137. UserInfo user = new UserInfo()
  138. {
  139. Name = "Richard老师",
  140. CreateTime = DateTime.Now,
  141. };
  142. db.Insertable(user).ExecuteCommand();
  143. }
  144. #endregion
  145. #region 调用实体内方法
  146. {
  147. db.CodeFirst.InitTables(typeof(UnitInsertMethod));
  148. db.Deleteable<UnitInsertMethod>().ExecuteCommand();
  149. db.Insertable(new UnitInsertMethod() { Name = "1" }).CallEntityMethod(it => it.Create()).ExecuteCommand();
  150. db.Updateable(new UnitInsertMethod() { Name = "1" }).CallEntityMethod(it => it.modify("admint")).ExecuteCommand();
  151. }
  152. #endregion
  153. #region Select Into 临时表
  154. {
  155. db.Ado.OpenAlways();//长连接
  156. db.Queryable<UserInfo>().Select(" * into #temp").ToList();//插入临时表
  157. var tempList = db.Queryable<dynamic>().AS("#temp").ToList();//查询临时表
  158. }
  159. #endregion
  160. }
  161. }

3.2、数据修改

输出Sql语句
单条更新
按需更新
批量修改
大数据量操作
只更新某列-选择更新
NULL列不更新
更新忽略null字段
无主键/指定列更新
条件更新
重新赋值更新
表达式更新 
插入返回值:
ExecuteCommand
返回受影响行数 , update where 如果没找到那么就会返回
0
ExecuteCommandHasChange
返回bool ,等同于 bool isChange= ExecuteCommand()>0
  1. /// <summary>
  2. /// 修改数据
  3. /// </summary>
  4. public static void UpdateData()
  5. {
  6. //如何输出Sql语句
  7. ConnectionConfig connectionConfig = new ConnectionConfig()
  8. {
  9. ConnectionString = CustomConnectionConfig.ConnectionString001,
  10. IsAutoCloseConnection = true,
  11. DbType = DbType.SqlServer
  12. };
  13. using (SqlSugarClient db = new SqlSugarClient(connectionConfig))
  14. {
  15. //初始化一条数据测试使用
  16. db.Insertable<Student>(new Student()
  17. {
  18. CreateTime = DateTime.Now,
  19. Name = "测试数据",
  20. SchoolId = 1,
  21. }).ExecuteCommand();
  22. { //输出Sql语句
  23. db.Aop.OnLogExecuting = (s, p) =>
  24. {
  25. Console.WriteLine("----------------------------");
  26. Console.WriteLine($"Sql语句:{s}");
  27. };
  28. }
  29. Student student = db.Queryable<Student>().First();
  30. //单条更新
  31. {
  32. student.CreateTime = DateTime.Now;
  33. db.Updateable<Student>(student).ExecuteCommand(); //右标题1 下面的所有菜单
  34. }
  35. //按需更新
  36. {
  37. db.Tracking(student);//创建跟踪
  38. student.Name = "a1" + Guid.NewGuid();
  39. //只改修改了name那么只会更新name
  40. //跟踪批量操作不会生效,原因:默认最佳性能(跟踪批量性能差,自已循环)
  41. //可以清空跟踪db.TempItems = null;
  42. db.Updateable(student).ExecuteCommand();
  43. }
  44. //批量修改
  45. {
  46. //List<Student> list = db.Queryable<Student>().Take(20).ToList();
  47. //foreach (var item in list)
  48. //{
  49. // item.Name = "New Name" + DateTime.Now;
  50. //}
  51. //db.Updateable(list).ExecuteCommand();
  52. 批量更新中,按需是不能操作的
  53. //foreach (var item in list)
  54. //{
  55. // item.Name = "New Name 02" + DateTime.Now;
  56. //}
  57. //db.Tracking(list);//创建跟踪
  58. //db.Updateable(list).ExecuteCommand();
  59. }
  60. //大数据量操作
  61. {
  62. //db.Deleteable<Student>().ExecuteCommand();//删除所有数据
  63. //List<Student> addlist = new List<Student>();
  64. //for (int i = 0; i < 1000000; i++)
  65. //{
  66. // addlist.Add(new Student()
  67. // {
  68. // CreateTime = DateTime.Now,
  69. // Name = "Richard" + i,
  70. // SchoolId = i
  71. // });
  72. //}
  73. //初始化1000000条数据到数据库
  74. //db.Fastest<Student>().BulkCopy(addlist);
  75. 大数据批量更新 适合列多数据多的更新 (MySql连接字符串要加AllowLoadLocalInfile=true )
  76. 普通方式操作
  77. //{
  78. // foreach (var item in addlist)
  79. // {
  80. // item.Name = $"批量修改第一次-Updateable方式";
  81. // }
  82. // Console.WriteLine("普通方式批量修改1000000条数据开始计时~~");
  83. // Stopwatch stopwatch = new Stopwatch();
  84. // stopwatch.Start();
  85. // db.Updateable<Student>(addlist).ExecuteCommand();
  86. // stopwatch.Stop();
  87. // Console.WriteLine($"批量修改1000000条数据共:{stopwatch.ElapsedMilliseconds} ms");
  88. //}
  89. 大数据量BulkUpdate操作--高性能
  90. //{
  91. // foreach (var item in addlist)
  92. // {
  93. // item.Name = $"批量修改第二次=BulkUpdate方式";
  94. // }
  95. // Console.WriteLine("大数据量操作-BulkUpdate方式批量修改1000000条数据开始计时~~");
  96. // Stopwatch stopwatch = new Stopwatch();
  97. // stopwatch.Start();
  98. // db.Fastest<Student>().BulkUpdate(addlist);
  99. // stopwatch.Stop();
  100. // Console.WriteLine($"批量修改1000000条数据共:{stopwatch.ElapsedMilliseconds} ms");
  101. //}
  102. }
  103. }
  104. using (SqlSugarClient db = new SqlSugarClient(connectionConfig))
  105. {
  106. //忽略某一列不更新
  107. {
  108. Student studentUp = db.Queryable<Student>().First();
  109. studentUp.SchoolId = 234;
  110. studentUp.Name = "忽略某一列不更新";
  111. studentUp.CreateTime = DateTime.Now.AddYears(5);
  112. var result = db.Updateable(studentUp)
  113. .IgnoreColumns(it => new
  114. {
  115. it.CreateTime
  116. })
  117. .ExecuteCommand();
  118. }
  119. }
  120. using (SqlSugarClient db = new SqlSugarClient(connectionConfig))
  121. {
  122. //只更新某列--按需更新
  123. {
  124. Student studentUp = db.Queryable<Student>().First();
  125. studentUp.SchoolId = 345;
  126. studentUp.Name = "只更新某列";
  127. studentUp.CreateTime = DateTime.Now.AddYears(6);
  128. var result = db.Updateable(studentUp).UpdateColumns(it => new { it.Name, it.CreateTime }).ExecuteCommand();
  129. }
  130. }
  131. using (SqlSugarClient db = new SqlSugarClient(connectionConfig))
  132. {
  133. //NULL列不更新
  134. {
  135. Student studentUp = db.Queryable<Student>().First();
  136. studentUp.SchoolId = 456;
  137. studentUp.Name = null;
  138. //更新忽略null字段
  139. var result = db.Updateable(studentUp)
  140. .IgnoreColumns(ignoreAllNullColumns: true)
  141. .ExecuteCommand();
  142. //更新忽略null并且忽略默认值 (比如int默认值是0就不更新)
  143. var result1 = db.Updateable(studentUp)
  144. .IgnoreColumns(ignoreAllNullColumns: true, ignoreAllDefaultValue: true)
  145. .ExecuteCommand();
  146. }
  147. }
  148. using (SqlSugarClient db = new SqlSugarClient(connectionConfig))
  149. {
  150. //无主键/指定列
  151. {
  152. //WhereColumns(it=>new { it.Id,it.Name}) //条件列不会被更新,只会作为条件
  153. Student studentUp = db.Queryable<Student>().First();
  154. studentUp.SchoolId = 567;
  155. studentUp.Name = null;
  156. var result = db.Updateable(studentUp)
  157. .WhereColumns(it => new
  158. {
  159. it.Id
  160. }).ExecuteCommand();//更新单 条根据ID
  161. var result1 = db.Updateable(studentUp)
  162. .WhereColumns(it => new
  163. {
  164. it.Id
  165. }).ExecuteCommand();//更新集合根据ID by id
  166. }
  167. }
  168. using (SqlSugarClient db = new SqlSugarClient(connectionConfig))
  169. {
  170. //条件更新
  171. {
  172. //如果是集合操作请更新到5.0.4版本之前版本禁止使用, 并且只有部分库支持
  173. Student studentUp = db.Queryable<Student>().First();
  174. studentUp.Name = "条件更新";
  175. var result = db.Updateable(studentUp).Where(it => it.Id == 7003783).ExecuteCommand();
  176. }
  177. }
  178. using (SqlSugarClient db = new SqlSugarClient(connectionConfig))
  179. {
  180. //重新赋值更新
  181. {
  182. Student studentUp = db.Queryable<Student>().First();
  183. studentUp.SchoolId = 678;
  184. studentUp.Name = "重新赋值";
  185. // studentUp.Name值的基础上在处理
  186. var result = db.Updateable(studentUp)
  187. .ReSetValue(it =>
  188. {
  189. it.Name = it.Name + "a";
  190. })
  191. .ExecuteCommand();
  192. //多个字段
  193. var result1 = db.Updateable(studentUp)
  194. .ReSetValue(it =>
  195. {
  196. it.Name = it.Name + "a";
  197. it.CreateTime = DateTime.Now;
  198. })
  199. .ExecuteCommand();
  200. }
  201. }
  202. using (SqlSugarClient db = new SqlSugarClient(connectionConfig))
  203. {
  204. //表达式更新
  205. {
  206. var result = db.Updateable<Student>()
  207. .SetColumns(it => new Student()
  208. {
  209. Name = "a",
  210. CreateTime = DateTime.Now
  211. })
  212. .Where(c => c.Id == 7003783)
  213. .ExecuteCommand();//正确没参数我们称为表达式更新
  214. }
  215. }
  216. using (SqlSugarClient db = new SqlSugarClient(connectionConfig))
  217. {
  218. //批量更新 In
  219. {
  220. var ids = db.Queryable<Student>()
  221. .Select(c => c.Id)
  222. .Take(5).ToList();
  223. var result = db.Updateable<Student>()
  224. .SetColumns(it => it.Name == "a")
  225. .Where(it => ids.Contains(it.Id))
  226. .ExecuteCommand();
  227. // in (1,2,3)
  228. }
  229. }
  230. using (SqlSugarClient db = new SqlSugarClient(connectionConfig))
  231. {
  232. //表达式无实体更新
  233. {
  234. var result = db.Updateable<DbTableInfo>()
  235. .AS("dbstudent")
  236. .SetColumns("StudentName", "表达式无实体更新")
  237. .Where("id=7003782").ExecuteCommand();
  238. }
  239. }
  240. using (SqlSugarClient db = new SqlSugarClient(connectionConfig))
  241. {
  242. //根据字典更新
  243. {
  244. //字典
  245. Dictionary<string, object> dt = new Dictionary<string, object>();
  246. dt.Add("id", 7003782);
  247. dt.Add("StudentName", "字典更新");
  248. dt.Add("createTime", DateTime.Now);
  249. var tResult = db.Updateable(dt).AS("dbstudent").WhereColumns("id").ExecuteCommand();
  250. //字典集合
  251. var dtList = new List<Dictionary<string, object>>();
  252. dtList.Add(dt);
  253. var t666 = db.Updateable(dtList).AS("dbstudent").WhereColumns("id").ExecuteCommand();
  254. }
  255. }
  256. }

3.3、数据删除函数

说明
Deleteable方法使用
ExecuteCommand
返回受影响行数 , update where 如果没找到那么就会返回
0
ExecuteCommandHasChange
返回bool ,等同于 bool isChange= ExecuteCommand()>0

  1. /// <summary>
  2. /// 删除数据
  3. /// </summary>
  4. public static void DeleteData()
  5. {
  6. ConnectionConfig connectionConfig = new ConnectionConfig()
  7. {
  8. ConnectionString = CustomConnectionConfig.ConnectionString001,
  9. IsAutoCloseConnection = true,
  10. DbType = DbType.SqlServer
  11. };
  12. using (SqlSugarClient db = new SqlSugarClient(connectionConfig))
  13. {
  14. db.CodeFirst.InitTables(typeof(StudentInfo));
  15. //表中数据全部清空,清除,自增初始化
  16. db.DbMaintenance.TruncateTable<StudentInfo>();
  17. //输出Sql语句
  18. db.Aop.OnLogExecuting = (s, p) =>
  19. {
  20. Console.WriteLine("----------------------------");
  21. Console.WriteLine($"Sql语句:{s}");
  22. };
  23. List<StudentInfo> addlist = new List<StudentInfo>();
  24. for (int i = 0; i < 500; i++)
  25. {
  26. addlist.Add(new StudentInfo()
  27. {
  28. Id = i + 1,
  29. CreateTime = DateTime.Now,
  30. Isdeleted = false,
  31. Name = $"名称_{i + 1}",
  32. SchoolId = i + 1,
  33. });
  34. }
  35. db.Deleteable<StudentInfo>().ExecuteCommand();
  36. db.Insertable<StudentInfo>(addlist).ExecuteCommand();
  37. //单个实体删除
  38. {
  39. db.Deleteable<StudentInfo>().Where(new StudentInfo() { Id = 1 }).ExecuteCommand();
  40. }
  41. //List<实体> 删除集合
  42. List<StudentInfo> list = new List<StudentInfo>()
  43. {
  44. new StudentInfo() { Id = 2 },
  45. new StudentInfo() { Id = 3 }
  46. };
  47. db.Deleteable<StudentInfo>(list).ExecuteCommandHasChange(); //批量删除
  48. //根据主键删除
  49. db.Deleteable<StudentInfo>().In(4).ExecuteCommand();
  50. //无主键删除
  51. db.Deleteable<StudentInfo>().In(it => it.Id, 5).ExecuteCommand();
  52. //根据主键数组删除
  53. db.Deleteable<StudentInfo>().In(new int[] { 6, 7 }).ExecuteCommand();
  54. //无主键数组删除
  55. db.Deleteable<StudentInfo>().In(it => it.Id, new int[] { 8, 9 }).ExecuteCommand();
  56. //表达式删除
  57. db.Deleteable<StudentInfo>().Where(it => it.Id == 10).ExecuteCommand();
  58. //无实体删除
  59. db.Deleteable<object>()
  60. .AS("[StudentInfo]")
  61. .Where("id=@id", new { id = 11 })
  62. .ExecuteCommand();
  63. db.Deleteable<object>()
  64. .AS("[StudentInfo]")
  65. .Where("id in (@id) ", new { id = new int[] { 12, 13, 14 } })
  66. .ExecuteCommand();//批量
  67. //根据字典集合删除
  68. Dictionary<string, object> parameter = new Dictionary<string, object>();
  69. parameter.Add("Id", 15);
  70. List<Dictionary<string, object>> dic = new List<Dictionary<string, object>>()
  71. {
  72. parameter
  73. };
  74. db.Deleteable<object>()
  75. .AS("[StudentInfo]")
  76. .WhereColumns(dic)
  77. .ExecuteCommand();
  78. }
  79. }

3.4、过滤器

通用操作的统一定制;
如果在数据库中表设计支持假删除,通过一个状态来记录当前这条数据是否被删除了;
定义了过滤器之后,定义过滤器就是一个条件,就可以把过滤器设置为全局;任何一个查询操作都会走
这个过滤器;
  1. //配置表过滤器
  2. db.QueryFilter.Add(new TableFilterItem<StudentInfo>(it => it.Name.Contains("名称")));
  3. //查询有效
  4. List<StudentInfo> resultlist = db.Queryable<StudentInfo>().ToList();
  5. //删除也有效
  6. db.Deleteable<StudentInfo>().EnableQueryFilter().Where(it => it.Id == 15).ExecuteCommand();
  7. //逻辑删除 请升级到5.0.4.9+
  8. //实体属性有isdelete或者isdeleted
  9. //假删除 软删除
  10. db.Deleteable<StudentInfo>().In(20).IsLogic().ExecuteCommand();
  11. //指定属性
  12. db.Deleteable<StudentInfo>().In(21).IsLogic().ExecuteCommand("Isdeleted");
  13. //指定属性并且修改时间
  14. db.Deleteable<StudentInfo>().In(22).IsLogic().ExecuteCommand("Isdeleted", 1, "CreateTime");

3.5、添加或者修改

场景:如果当前操作的数据在数据库中不存在就认为是添加操作,如果存在就修改操作;
根据主键ID来,如果ID为零,就新增--数据库中自动生成ID
如果ID不为零,就认为是修改的动作;
  1. /// <summary>
  2. /// 插入或更新
  3. /// </summary>
  4. public static void AddOrUpdate()
  5. {
  6. ConnectionConfig connectionConfig = new ConnectionConfig()
  7. {
  8. ConnectionString = CustomConnectionConfig.ConnectionString001,
  9. IsAutoCloseConnection = true,
  10. DbType = DbType.SqlServer
  11. };
  12. using (SqlSugarClient db = new SqlSugarClient(connectionConfig))
  13. {
  14. db.Deleteable<StudentInfo>().ExecuteCommand();
  15. //不存在就插入,存在就修改
  16. {
  17. StudentInfo studentInfo = new StudentInfo()
  18. {
  19. Id = 31,
  20. Name = "新增的数据",
  21. CreateTime = DateTime.Now,
  22. Isdeleted = false,
  23. SchoolId = 0,
  24. };
  25. //新功能 5.0.6.2+
  26. //存在更新 不存在插入 (默认是主键)
  27. db.Storageable(studentInfo).ExecuteCommand();//新版才支持
  28. studentInfo.Name = "数据已存在就修改";
  29. db.Storageable(studentInfo).ExecuteCommand();//新版才支持
  30. //批量操作---存在更新 不存在插入
  31. List<StudentInfo> addlist = new List<StudentInfo>();
  32. for (int i = 0; i < 20; i++)
  33. {
  34. addlist.Add(new StudentInfo()
  35. {
  36. Id = i + 1,
  37. CreateTime = DateTime.Now,
  38. Isdeleted = false,
  39. Name = $"名称_{i + 1}",
  40. SchoolId = i + 1,
  41. });
  42. }
  43. db.Storageable<StudentInfo>(addlist).ExecuteCommand();
  44. foreach (var item in addlist)
  45. {
  46. item.Name = $"批量修改";
  47. }
  48. db.Storageable<StudentInfo>(addlist).ExecuteCommand();
  49. }
  50. StudentInfo obj = new StudentInfo()
  51. {
  52. CreateTime = DateTime.Now,
  53. Isdeleted = false,
  54. Name = $"名称_41",
  55. SchoolId = 41,
  56. };
  57. //等于0插入否则更新(不验证数据库是否存在)
  58. {
  59. db.Storageable(obj)
  60. .SplitUpdate(it => it.Item.Id > 0)
  61. .SplitInsert(it => true).ExecuteCommand();
  62. obj.Id = 1;
  63. obj.Name = "修改一下数据";
  64. db.Storageable(obj)
  65. .SplitUpdate(it => it.Item.Id > 0)
  66. .SplitInsert(it => true).ExecuteCommand();
  67. }
  68. StudentInfo upobj = new StudentInfo()
  69. {
  70. Id = 51,
  71. CreateTime = DateTime.Now,
  72. Isdeleted = false,
  73. Name = $"名称_41",
  74. SchoolId = 41,
  75. };
  76. upobj.Name = "测试数据";
  77. //忽略部分字段更新
  78. {
  79. StorageableResult<StudentInfo> storageableResult = db.Storageable(upobj)
  80. .ToStorage();
  81. //不存在插入
  82. storageableResult.AsInsertable.ExecuteCommand();
  83. //修改部分数据
  84. upobj.Name = "Name修改了";
  85. upobj.CreateTime = DateTime.Now.AddYears(10);
  86. //存在更新
  87. StorageableResult<StudentInfo> storageableResult1 = db.Storageable(upobj)
  88. .ToStorage();
  89. storageableResult1.AsUpdateable.IgnoreColumns(z => z.Name).ExecuteCommand();
  90. var insertlist = storageableResult1.InsertList;
  91. var updateList = storageableResult1.UpdateList;
  92. }
  93. //无主键操作
  94. {
  95. upobj.CreateTime = DateTime.Now.AddYears(-5);
  96. upobj.Name = "无主键操作";
  97. db.Storageable(upobj)
  98. .WhereColumns(it => it.Id)//指定一个条件,当然支持多个 new {it.id,it.name}
  99. .ExecuteCommand();//将数据进行分组
  100. }
  101. //对于性能要求高,数据量大的可以这么操作,适合1万以上数据处理
  102. {
  103. db.Deleteable<StudentInfo>().ExecuteCommand(); //删除所有数据
  104. var addlist = new List<StudentInfo>();
  105. for (int i = 0; i < 100000; i++)
  106. {
  107. addlist.Add(new StudentInfo()
  108. {
  109. Id = i + 1,
  110. CreateTime = DateTime.Now,
  111. Isdeleted = false,
  112. Name = $"名称_{i + 1}",
  113. SchoolId = i + 1,
  114. });
  115. }
  116. StorageableResult<StudentInfo> storageableResult = db.
  117. Storageable<StudentInfo>(addlist).ToStorage();
  118. storageableResult.BulkCopy();
  119. }
  120. //字典用法
  121. {
  122. db.Deleteable<StudentInfo>().ExecuteCommand();
  123. List<Dictionary<string, object>> dictionaryList = new List<Dictionary<string, object>>();
  124. Dictionary<string, object> dic = new Dictionary<string, object>();
  125. dic.Add("Id", 456789);
  126. dic.Add("SchoolId", 456789);
  127. dic.Add("Name", "字典用法");
  128. dic.Add("CreateTime", DateTime.Now);
  129. dic.Add("Isdeleted", 1);
  130. dictionaryList.Add(dic);
  131. DataTableResult tableResult = db.Storageable(dictionaryList, "StudentInfo")
  132. .WhereColumns("id")
  133. .ToStorage();//id作为主键
  134. tableResult.AsInsertable.ExecuteCommand();//如果是自增要添加IgnoreColumns
  135. dictionaryList[0]["Name"] = "修改名称了";
  136. DataTableResult tableResult1 = db.Storageable(dictionaryList, "StudentInfo")
  137. .WhereColumns("id")
  138. .ToStorage();//id作为主键
  139. tableResult1.AsUpdateable.ExecuteCommand();
  140. }
  141. //分页处理
  142. {
  143. List<StudentInfo> list = db.Queryable<StudentInfo>().ToList();
  144. //分页处理
  145. db.Utilities.PageEach(list, 2000, pageList =>
  146. {
  147. db.Storageable(pageList).ExecuteCommand();
  148. //条件列禁止varchar(50)以上,并且是主键或者有索引为佳
  149. //也可以用BulkCopy
  150. //var x= db.Storageable<Order>(data).ToStorage();
  151. //x.BulkCopy();
  152. //x.BulkUpdate();
  153. });
  154. }
  155. }
  156. }

3.6、单表基本查询

查询集合
查询总数
按条件查询
多条件查询
动态OR查询
模糊查询
主键查询
查询第一条
查前几条
是否存在记录
In查询/Not In
排序
In的模糊查询
多个字段 条件拼接
  1. ConnectionConfig connectionConfig = new ConnectionConfig()
  2. {
  3. ConnectionString = CustomConnectionConfig.ConnectionString001,
  4. IsAutoCloseConnection = true,
  5. DbType = DbType.SqlServer
  6. };
  7. using (SqlSugarClient db = new SqlSugarClient(connectionConfig))
  8. {
  9. db.Aop.OnLogExecuting = (s, p) =>
  10. {
  11. Console.WriteLine("----------------------------");
  12. Console.WriteLine($"Sql语句:{s}");
  13. };
  14. List<StudentInfo> addlist = new List<StudentInfo>();
  15. for (int i = 0; i < 500; i++)
  16. {
  17. addlist.Add(new StudentInfo()
  18. {
  19. Id = i + 1,
  20. CreateTime = DateTime.Now,
  21. Isdeleted = false,
  22. Name = $"名称_{i + 1}",
  23. SchoolId = i + 1,
  24. });
  25. }
  26. db.Deleteable<StudentInfo>().ExecuteCommand();
  27. db.Insertable<StudentInfo>(addlist).ExecuteCommand();
  28. //查询集合-//select * from StudentInfo
  29. List<StudentInfo> list = db.Queryable<StudentInfo>().ToList();
  30. //查询总数
  31. int count = db.Queryable<StudentInfo>().Count();
  32. //select count(1) from StudentInfo
  33. List<StudentInfo> studentList;
  34. //按条件查询
  35. {
  36. studentList = db.Queryable<StudentInfo>()
  37. .Where(it => it.Id == 1).ToList();
  38. //select * from StudentInfo where id=1
  39. studentList = db.Queryable<StudentInfo>()
  40. .Where(it => it.Name != null).ToList();
  41. //不是null
  42. //select * from StudentInfo where name is not null
  43. studentList = db.Queryable<StudentInfo>()
  44. .Where(it => it.Name == null).ToList();
  45. //是null
  46. //select * from StudentInfo where name is null
  47. studentList = db.Queryable<StudentInfo>()
  48. .Where(it => it.Name != "名称_11").ToList();
  49. //不是空 ,不为空
  50. //select * from StudentInfo where name <> ''
  51. }
  52. //多条件查询
  53. {
  54. studentList = db.Queryable<StudentInfo>()
  55. .Where(it => it.Id > 10 && it.Name == "名称_11").ToList();
  56. //select * from StudentInfo where id>10 and name='a'
  57. studentList = db.Queryable<StudentInfo>()
  58. .Where(it => it.Id > 10)
  59. .Where(it => it.Name == "名称_11").ToList();
  60. }
  61. //动态OR查询
  62. {
  63. Expressionable<StudentInfo> exp = Expressionable.Create<StudentInfo>();
  64. string name = "名称_11";
  65. //.OrIf 是条件成立才会拼接OR
  66. exp.OrIF(!string.IsNullOrWhiteSpace(name), it => it.Name.Contains(name));
  67. //拼接OR
  68. exp.Or(it => it.Name.Contains("名称_"));
  69. studentList = db.Queryable<StudentInfo>()
  70. .Where(exp.ToExpression()).ToList();
  71. }
  72. //模糊查询
  73. {
  74. studentList = db.Queryable<StudentInfo>()
  75. .Where(it => it.Name.Contains("名称_")).ToList();
  76. //select * from StudentInfo where name like %jack%
  77. }
  78. //根据主键查询
  79. {
  80. /*单主键查询*/
  81. //通过主键查询 SingleById
  82. db.Queryable<StudentInfo>().InSingle(2);
  83. //根据ID查询
  84. //select * from StudentInfo where id=2
  85. db.Queryable<StudentInfo>().Single(it => it.Id == 2);
  86. /*多主键查询*/
  87. var getAll = db.Queryable<StudentInfo>()
  88. .WhereClassByPrimaryKey(new StudentInfo() { Id = 123 })
  89. .ToList(); //单个实体
  90. getAll = db.Queryable<StudentInfo>()
  91. .WhereClassByPrimaryKey(new List<StudentInfo>()
  92. {
  93. new StudentInfo() { Id = 123 },
  94. new StudentInfo() { Id = 234 },
  95. new StudentInfo() { Id = 345 }
  96. }).ToList(); //支持集合
  97. }
  98. //查询第一条 ,第一行
  99. {
  100. //First() 等同于C#中的 FirstOrDefault , 没有值返回 null
  101. //没有返回Null
  102. StudentInfo student = db.Queryable<StudentInfo>()
  103. .First(it => it.Id == 1);
  104. }
  105. {
  106. //没有返回Null
  107. //select top 1 * from StudentInfo order by id desc where id=1
  108. StudentInfo student = db.Queryable<StudentInfo>()
  109. .OrderBy(it => it.Id, OrderByType.Desc)
  110. .First(it => it.Id == 1);
  111. }
  112. //查前几条
  113. {
  114. List<StudentInfo> studetntlist = db.Queryable<StudentInfo>()
  115. .Take(10)
  116. .ToList();
  117. }
  118. //数据行数
  119. {
  120. int count1 = db.Queryable<StudentInfo>()
  121. .Where(it => it.Id > 11).Count();//同步
  122. Task<int> countTask = db.Queryable<StudentInfo>()
  123. .Where(it => it.Id > 11).CountAsync();
  124. //异步
  125. //select count(*) from StudentInfo where id>11
  126. //你也可以用函数
  127. //SqlFunc.AggregateCount
  128. }
  129. //是否存在记录
  130. {
  131. db.Close();
  132. db.Open();
  133. bool isExists = db.Queryable<StudentInfo>()
  134. .Where(it => it.Id > 11)
  135. .Any();
  136. isExists = db.Queryable<StudentInfo>()
  137. .Any(it => it.Id > 11); //上面语法的简化
  138. }
  139. //In查询,IN的使用
  140. {
  141. int[] allIds = new int[] { 2, 3, 31 };
  142. List<StudentInfo> list1 = db.Queryable<StudentInfo>().Where(it => allIds.Contains(it.Id)).ToList();
  143. //字符串类型 varchar和nvarchar (默认varchar来保证性能)
  144. //NameList.Contains(it.Name, true) //true和false来控制是varchar还是nvarchar
  145. }
  146. //多个字段 条件拼接
  147. {
  148. List<StudentInfo> OrderList = new List<StudentInfo>()
  149. {
  150. new StudentInfo{ Id = 1,Name="名称_1"},
  151. new StudentInfo{ Id = 2,Name="名称_2"},
  152. new StudentInfo{ Id = 3,Name="名称_3"}
  153. };
  154. Expressionable<StudentInfo> exp = new Expressionable<StudentInfo>();
  155. foreach (var item in OrderList)
  156. {
  157. exp.Or(it => it.Id == item.Id && it.Name == item.Name);
  158. }
  159. //使用构造好的表达式
  160. var studentlist = db.Queryable<StudentInfo>().Where(exp.ToExpression()).ToList();
  161. }
  162. //使用 in 的模糊查询
  163. {
  164. var names = new string[] { "名称_", "名称_11" };
  165. Expressionable<StudentInfo> exp = new Expressionable<StudentInfo>();
  166. foreach (var item in names)
  167. {
  168. exp.Or(it => it.Name.Contains(item));
  169. }
  170. var studentlist = db.Queryable<StudentInfo>()
  171. .Where(exp.ToExpression()).ToList();
  172. }
  173. //NOT IN
  174. {
  175. int[] allIds = new int[] { 2, 3, 31 };
  176. var studentlist = db.Queryable<StudentInfo>()
  177. .Where(it => !allIds.Contains(it.Id))
  178. .ToList();
  179. }
  180. //简单排序
  181. {
  182. var studentlist = db.Queryable<StudentInfo>()
  183. .OrderBy(st => st.Id, OrderByType.Desc)
  184. .ToList();
  185. }
  186. //查询一列
  187. {
  188. //单值 查询列 查询单独列
  189. var studentlist = db.Queryable<StudentInfo>()
  190. .Select(it => it.Name)
  191. .ToList();
  192. }
  193. //查询单条
  194. {
  195. StudentInfo student = db.Queryable<StudentInfo>().Single(it => it.Id == 1);
  196. //没有返回Null,如果结果大于1条会抛出错误
  197. //select * from StudentInfo where id=1 // 查询id等于1的单条记录
  198. }
  199. //获取最大值,最小值
  200. {
  201. int maxNum = db.Queryable<StudentInfo>()
  202. .Max(it => it.Id);//同步
  203. Task<int> maxTask = db.Queryable<StudentInfo>()
  204. .MaxAsync(it => it.Id);//异步
  205. db.Close();
  206. db.Open();
  207. int minNum = db.Queryable<StudentInfo>()
  208. .Min(it => it.Id);//同步
  209. Task<int> minTask = db.Queryable<StudentInfo>()
  210. .MinAsync(it => it.Id);//异步
  211. }
  212. //求和
  213. {
  214. db.Close();
  215. db.Open();
  216. int sumNum = db.Queryable<StudentInfo>()
  217. .Sum(it => it.Id);//同步
  218. Task<int> sumTask = db.Queryable<StudentInfo>()
  219. .SumAsync(it => it.Id);//异步
  220. }
  221. //查询过滤排除某一个字段
  222. {
  223. /***单表***/
  224. db.Close();
  225. db.Open();
  226. db.Queryable<StudentInfo>().ToList();
  227. db.Queryable<StudentInfo>().IgnoreColumns(it => it.Name).ToList();//只支持单表查询
  228. }
  229. }

3.7、连接查询

左连接查询
右连接查询
内连接查询
全连接查询
并集查询
准备数据
  1. [SugarTable("User")]//
  2. public class User
  3. {
  4. [SugarColumn(IsPrimaryKey = true, IsIdentity = true)]//数据库是自增才配自增
  5. public int Id { get; set; }
  6. [SugarColumn(ColumnName = "CompanyId", IsNullable = true)]
  7. public int? CompanyId { get; set; }
  8. [Navigate(NavigateType.ManyToOne, nameof(CompanyId))]
  9. public Company? CompanyInfo { get; set; }
  10. [SugarColumn(ColumnName = "UserName", IsNullable = true)]//数据库与实体不一样设置列名
  11. public string? UserName { get; set; }
  12. [SugarColumn(ColumnName = "CreateTime", IsNullable = true)]
  13. public DateTime? CreateTime { get; set; }
  14. public int UserDetailId { get; set; }
  15. [Navigate(NavigateType.OneToOne, nameof(UserDetailId))]
  16. public UserDetail? UserDetailInfo { get; set; } //不能赋值只能是null
  17. [Navigate(typeof(UserRoleMapping), nameof(UserRoleMapping.UserId), nameof(UserRoleMapping.RoleId))]//注意顺序
  18. public List<Role> RoleList { get; set; } //不能赋值只能是null
  19. }
  20. public class Company
  21. {
  22. [SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
  23. public int Id { get; set; }
  24. public string? CompanyName { get; set; }
  25. public DateTime CreateTime { get; set; }
  26. [Navigate(NavigateType.OneToMany, nameof(User.CompanyId))]
  27. public List<User>? UserList { get; set; }
  28. }
  29. [SugarTable("UserScore")]//
  30. public class UserScore
  31. {
  32. [SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
  33. public int Id { get; set; }
  34. public int UserId { get; set; }
  35. /// <summary>
  36. /// 考核指标
  37. /// </summary>
  38. public string? Subject { get; set; }
  39. /// <summary>
  40. /// 考核成绩
  41. /// </summary>
  42. public int Achievement { get; set; }
  43. public DateTime? CreateTime { get; set; }
  44. }
 
代码
  1. /// <summary>
  2. /// 连接查询--必然涉及到有多个表
  3. /// </summary>
  4. public static void LinkQueryShow()
  5. {
  6. ConnectionConfig connectionConfig = new ConnectionConfig()
  7. {
  8. ConnectionString = CustomConnectionConfig.ConnectionString001,
  9. IsAutoCloseConnection = true,
  10. DbType = DbType.SqlServer
  11. };
  12. using (SqlSugarClient db = new SqlSugarClient(connectionConfig))
  13. {
  14. db.CodeFirst.InitTables<Company>();
  15. db.CodeFirst.InitTables<User>();
  16. db.CodeFirst.InitTables<UserScore>();
  17. db.Deleteable<UserScore>().ExecuteCommand();
  18. db.Deleteable<Company>().ExecuteCommand();
  19. db.Deleteable<User>().ExecuteCommand();
  20. List<Company> companyList = new List<Company>();
  21. for (int i = 0; i < 3; i++)
  22. {
  23. companyList.Add(new Company()
  24. {
  25. CreateTime = DateTime.Now,
  26. Id = i + 1,
  27. CompanyName = $"朝夕教育_{i + 1}"
  28. });
  29. }
  30. db.Insertable<Company>(companyList).ExecuteCommand();
  31. List<User> userList = new List<User>();
  32. List<UserScore> userScoreList = new List<UserScore>();
  33. for (int i = 0; i < 10; i++)
  34. {
  35. userList.Add(new User()
  36. {
  37. CreateTime = DateTime.Now,
  38. Id = i + 1,
  39. UserName = $"用户_{i + 1}",
  40. CompanyId = companyList[0].Id
  41. });
  42. userScoreList.Add(new UserScore()
  43. {
  44. UserId = i + 1,
  45. Subject = "考勤",
  46. Achievement = 90,
  47. CreateTime = DateTime.Now
  48. });
  49. userScoreList.Add(new UserScore()
  50. {
  51. UserId = i + 1,
  52. Subject = "绩效",
  53. Achievement = 90,
  54. CreateTime = DateTime.Now
  55. });
  56. userScoreList.Add(new UserScore()
  57. {
  58. UserId = i + 1,
  59. Subject = "项目奖金",
  60. Achievement = 89,
  61. CreateTime = DateTime.Now
  62. });
  63. }
  64. db.Insertable<User>(userList).ExecuteCommand();
  65. db.Insertable<UserScore>(userScoreList).ExecuteCommand();
  66. //配置生成sql语句
  67. {
  68. db.Aop.OnLogExecuting = (s, p) =>
  69. {
  70. Console.WriteLine("----------------------------");
  71. Console.WriteLine($"Sql语句:{s}");
  72. };
  73. }
  74. //左连接
  75. {
  76. var query1 = db.Queryable<Company>()
  77. .LeftJoin<User>((c, u) => c.Id == u.CompanyId)
  78. .LeftJoin<UserScore>((c, u, us) => u.Id == us.UserId)
  79. .Where(c => c.Id == 1)
  80. .Select((c, u, us) => new
  81. {
  82. CompanyId = c.Id,
  83. CompanyName = c.CompanyName,
  84. UserNae = u.UserName,
  85. Subject = us.Subject,
  86. ScoreCoutn = us.Achievement
  87. })
  88. .ToList();
  89. var query2 = db.Queryable<Company, User, UserScore>((c, u, us) =>
  90. new JoinQueryInfos(JoinType.Left, c.Id == u.CompanyId, JoinType.Left, u.Id == us.UserId
  91. ))
  92. .Where(c => c.Id == 1)
  93. .Select((c, u, us) => new
  94. {
  95. CompanyId = c.Id,
  96. CompanyName = c.CompanyName,
  97. UserNae = u.UserName,
  98. Subject = us.Subject,
  99. ScoreCoutn = us.Achievement
  100. }).ToList();
  101. }
  102. //右链接
  103. {
  104. var query1 = db.Queryable<Company>()
  105. .RightJoin<User>((c, u) => c.Id == u.CompanyId)
  106. .RightJoin<UserScore>((c, u, us) => u.Id == us.UserId)
  107. .Where(c => c.Id == 1)
  108. .Select((c, u, us) => new
  109. {
  110. CompanyId = c.Id,
  111. CompanyName = c.CompanyName,
  112. UserNae = u.UserName,
  113. Subject = us.Subject,
  114. ScoreCoutn = us.Achievement
  115. })
  116. .ToList();
  117. var query2 = db.Queryable<Company, User, UserScore>((c, u, us) =>
  118. new JoinQueryInfos(JoinType.Right, c.Id == u.CompanyId, JoinType.Right, u.Id == us.UserId
  119. ))
  120. .Where(c => c.Id == 1)
  121. .Select((c, u, us) => new
  122. {
  123. CompanyId = c.Id,
  124. CompanyName = c.CompanyName,
  125. UserNae = u.UserName,
  126. Subject = us.Subject,
  127. ScoreCoutn = us.Achievement
  128. }).ToList();
  129. }
  130. //内连接
  131. {
  132. var query1 = db.Queryable<Company>()
  133. .InnerJoin<User>((c, u) => c.Id == u.CompanyId)
  134. .InnerJoin<UserScore>((c, u, us) => u.Id == us.UserId)
  135. .Where(c => c.Id == 1)
  136. .Select((c, u, us) => new
  137. {
  138. CompanyId = c.Id,
  139. CompanyName = c.CompanyName,
  140. UserNae = u.UserName,
  141. Subject = us.Subject,
  142. ScoreCoutn = us.Achievement
  143. })
  144. .ToList();
  145. var query2 = db.Queryable<Company, User, UserScore>((c, u, us) =>
  146. new JoinQueryInfos(JoinType.Inner, c.Id == u.CompanyId, JoinType.Inner, u.Id == us.UserId
  147. ))
  148. .Where(c => c.Id == 1)
  149. .Select((c, u, us) => new
  150. {
  151. CompanyId = c.Id,
  152. CompanyName = c.CompanyName,
  153. UserNae = u.UserName,
  154. Subject = us.Subject,
  155. ScoreCoutn = us.Achievement
  156. }).ToList();
  157. }
  158. //全连接
  159. {
  160. var query1 = db.Queryable<Company>()
  161. .FullJoin<User>((c, u) => c.Id == u.CompanyId)
  162. .FullJoin<UserScore>((c, u, us) => u.Id == us.UserId)
  163. .Where(c => c.Id == 1)
  164. .Select((c, u, us) => new
  165. {
  166. CompanyId = c.Id,
  167. CompanyName = c.CompanyName,
  168. UserNae = u.UserName,
  169. Subject = us.Subject,
  170. ScoreCoutn = us.Achievement
  171. })
  172. .ToList();
  173. var query2 = db.Queryable<Company, User, UserScore>((c, u, us) =>
  174. new JoinQueryInfos(JoinType.Full, c.Id == u.CompanyId, JoinType.Full, u.Id == us.UserId
  175. ))
  176. .Where(c => c.Id == 1)
  177. .Select((c, u, us) => new
  178. {
  179. CompanyId = c.Id,
  180. CompanyName = c.CompanyName,
  181. UserNae = u.UserName,
  182. Subject = us.Subject,
  183. ScoreCoutn = us.Achievement
  184. }).ToList();
  185. }
  186. //并集
  187. {
  188. var q1 = db.Queryable<Student>()
  189. .Select(it => new User { UserName = it.Name });
  190. var q2 = db.Queryable<User>()
  191. .Select(it => new User { UserName = it.UserName });
  192. var list = db.UnionAll(q1, q2).ToList();
  193. }
  194. };
  195. }

3.8、复杂查询

分组聚合
Distinct关键字
开窗函数
合并结合
分页查询
Order排序
  1. /// <summary>
  2. /// 复杂查询
  3. /// </summary>
  4. public static void ComplexQueryShow()
  5. {
  6. ConnectionConfig connectionConfig = new ConnectionConfig()
  7. {
  8. ConnectionString = CustomConnectionConfig.ConnectionString001,
  9. IsAutoCloseConnection = true,
  10. DbType = DbType.SqlServer
  11. };
  12. using (SqlSugarClient db = new SqlSugarClient(connectionConfig))
  13. {
  14. //配置生成sql语句
  15. {
  16. db.Aop.OnLogExecuting = (s, p) =>
  17. {
  18. Console.WriteLine("----------------------------");
  19. Console.WriteLine($"Sql语句:{s}");
  20. };
  21. }
  22. //分组聚合
  23. {
  24. var list = db.Queryable<Student>()
  25. .GroupBy(it => new { it.Id, it.Name })
  26. .Having(it => SqlFunc.AggregateAvg(it.Id) > 0)
  27. .Select(it => new
  28. {
  29. idAvg = SqlFunc.AggregateAvg(it.Id),
  30. count = SqlFunc.AggregateCount(it.Id),
  31. name = it.Name
  32. })
  33. .ToList();
  34. }
  35. //一般用来指定字段去重复,查询不重复的值,去重字段
  36. {
  37. var list = db.Queryable<Student>()
  38. .Distinct()
  39. .Select(it => new { it.Name }).ToList();
  40. }
  41. //开窗函数
  42. {
  43. var model = db.Queryable<Student>()
  44. .Take(1)
  45. .PartitionBy(it => it.Name)
  46. .ToList();
  47. var model1 = db.Queryable<Student>()
  48. .OrderBy(it => it.Id, OrderByType.Desc)
  49. .Take(1)
  50. .PartitionBy(it => it.Name)
  51. .ToList();
  52. }
  53. //合并结合
  54. {
  55. var test48 = db.Queryable<Student>().Select(it => new
  56. {
  57. index2 = SqlFunc.RowNumber(it.Id, it.Name),
  58. name = it.Name,
  59. date = it.CreateTime
  60. })
  61. .MergeTable()//将结果合并成一个表
  62. .Where(it => it.index2 == 1)
  63. .ToList();
  64. }
  65. //分页查询
  66. {
  67. {
  68. int pagenumber = 2; // pagenumber是从1开始的不是从零开始的
  69. int pageSize = 2;
  70. int totalCount = 0;
  71. //单表分页
  72. var page = db.Queryable<Student>()
  73. .ToPageList(pagenumber, pageSize, ref totalCount);
  74. var page1 = db.Queryable<Student>()
  75. .ToOffsetPage(pagenumber, pageSize, ref totalCount);
  76. }
  77. //如果SqlServer不想有Rownumber可以用 ToOffsetPage 较新版本支持
  78. //多表分页
  79. {
  80. int pagenumber = 1; // pagenumber是从1开始的不是从零开始的
  81. int pageSize = 20;
  82. int totalCount = 0;
  83. var list = db.Queryable<Company>()
  84. .LeftJoin<User>((c, u) => c.Id == u.CompanyId)
  85. .Select((c, u) => new
  86. {
  87. Id = c.Id,
  88. cName = c.CompanyName,
  89. uId = u.Id,
  90. uName = u.UserName
  91. }).ToOffsetPage(pagenumber, pageSize, ref totalCount);
  92. }
  93. //异步分页
  94. {
  95. int pagenumber = 1; // pagenumber是从1开始的不是从零开始的
  96. int pageSize = 20;
  97. int totalCount = 0;
  98. RefAsync<int> total = 0;//REF和OUT不支持异步,想要真的异步这是最优解
  99. Task<List<Student>> studentTask =
  100. db.Queryable<Student>()
  101. .ToPageListAsync(pagenumber, pageSize, total);//ToPageAsync
  102. List<Student> list = studentTask.Result;
  103. }
  104. }
  105. //Order排序
  106. {
  107. var list = db.Queryable<Company, User>((c, u) => new JoinQueryInfos(JoinType.Left, c.Id == u.CompanyId))
  108. .OrderBy(c => c.Id)//升序
  109. .OrderBy((c, u) => c.CompanyName, OrderByType.Desc)//倒序
  110. .Select((c, u) => new
  111. {
  112. cId = c.Id,
  113. cName = c.CompanyName,
  114. uId = u.Id,
  115. uName = u.UserName
  116. }).ToList();
  117. }
  118. //多个Order一起
  119. {
  120. var list = db.Queryable<User>()
  121. .OrderBy(it => new
  122. {
  123. it.Id,
  124. name = SqlFunc.Desc(it.UserName)
  125. }).ToList();
  126. }
  127. //动态排序
  128. {
  129. //通过类中属性名获取数据库字段名
  130. {
  131. var orderByFieldName = db.EntityMaintenance.GetDbColumnName<User>("Id");//防注入
  132. var list = db.Queryable<Student>()
  133. .OrderBy(orderByFieldName + " asc ")
  134. .ToList(); ;
  135. }
  136. {
  137. var list = db.Queryable<Company, User>((c, u) => new JoinQueryInfos(JoinType.Left, c.Id == u.CompanyId))
  138. .OrderBy("c.id asc,u.Id desc ") //多表查询有别名(c&u)
  139. .Select((c, u) => new
  140. {
  141. cId = c.Id,
  142. cName = c.CompanyName,
  143. uId = u.Id,
  144. uName = u.UserName
  145. }).ToList();
  146. }
  147. {
  148. var pageJoin = db.Queryable<Company, User>((c, u) => new JoinQueryInfos(JoinType.Left, c.Id == u.CompanyId))
  149. .Select((c, u) => new
  150. {
  151. cId = c.Id,
  152. cName = c.CompanyName,
  153. uId = u.Id,
  154. uName = u.UserName
  155. })
  156. .MergeTable()//将查询结果集变成表MergeTable
  157. .Where(it => it.cId == 1)
  158. .OrderBy("cName asc").ToList();//对表MergeTable进行排序
  159. }
  160. //随机排序取10条
  161. {
  162. db.Queryable<Student>().Take(10).OrderBy(st => SqlFunc.GetRandom()).ToList();
  163. }
  164. }
  165. }
  166. }

3.9、导航属性

导航属性是 实体类型 上的可选属性,它允许从 关联 一端 导航到另一端。 与其他 属性 不同,导航属
性并不携带数据。
关系型数据库--保存数据--保存数据之间的关系;
表关系:一对一关系 一个人---对应一个身份证号 一夫一妻
一对多关系 一个老师带多个学生 公司有多个员工
多对多关系 课程和学员,一个学员可以学习多个课程 一个课程可以让多个学员来学
习,
用户角色关系
补充:动态导航,在程序中可以不用配置关联字段,在查询的过程中,把需要关联的字段,手动匹配完
成导航查询;
补充: 多对一关系。
准备
  1. public enum NavigateType
  2. {
  3. OneToOne = 1,
  4. OneToMany,
  5. ManyToOne,
  6. ManyToMany,
  7. Dynamic
  8. }
  9. ///NavigateType.OneToOne
  10. [SugarTable("User")]//
  11. public class User
  12. {
  13. [SugarColumn(IsPrimaryKey = true, IsIdentity = true)]//数据库是自增才配自增
  14. public int Id { get; set; }
  15. [SugarColumn(ColumnName = "CompanyId", IsNullable = true)]
  16. public int? CompanyId { get; set; }
  17. [Navigate(NavigateType.ManyToOne, nameof(CompanyId))]
  18. public Company? CompanyInfo { get; set; }
  19. [SugarColumn(ColumnName = "UserName", IsNullable = true)]//数据库与实体不一样设置列名
  20. public string? UserName { get; set; }
  21. [SugarColumn(ColumnName = "CreateTime", IsNullable = true)]
  22. public DateTime? CreateTime { get; set; }
  23. public int UserDetailId { get; set; }
  24. [Navigate(NavigateType.OneToOne, nameof(UserDetailId))]
  25. public UserDetail? UserDetailInfo { get; set; } //不能赋值只能是null
  26. [Navigate(typeof(UserRoleMapping), nameof(UserRoleMapping.UserId), nameof(UserRoleMapping.RoleId))]//注意顺序
  27. public List<Role> RoleList { get; set; } //不能赋值只能是null
  28. }
  29. public class StudentA
  30. {
  31. [SugarColumn(IsPrimaryKey = true)]
  32. public int StudentId { get; set; }
  33. public string? Name { get; set; }
  34. public int SchoolId { get; set; }
  35. [SugarColumn(IsIgnore = true)]
  36. public SchoolA SchoolA { get; set; }
  37. [Navigate(NavigateType.Dynamic, null)] //自定义关系映射
  38. public List<BookA> Books { get; set; } //只能是null 不能赋默认值
  39. }
  40. public class BookA
  41. {
  42. [SugarColumn(IsPrimaryKey = true, IsIdentity = true)]
  43. public int BookId { get; set; }
  44. public string? Name { get; set; }
  45. public int studenId { get; set; }
  46. }
  47. public class SchoolA
  48. {
  49. [SugarColumn(IsPrimaryKey = true)]
  50. public int SchoolId { get; set; }
  51. public string? SchoolName { get; set; }
  52. [SugarColumn(IsIgnore = true)]
  53. public List<RoomA> RoomList { get; set; }
  54. [SugarColumn(IsIgnore = true)]
  55. public List<TeacherA> TeacherList { get; set; }
  56. }
  57. public class TeacherA
  58. {
  59. [SugarColumn(IsPrimaryKey = true)]
  60. public int Id { get; set; }
  61. public int SchoolId { get; set; }
  62. public string? Name { get; set; }
  63. }
  64. public class RoomA
  65. {
  66. [SugarColumn(IsPrimaryKey = true)]
  67. public int RoomId { get; set; }
  68. public string? RoomName { get; set; }
  69. public int SchoolId { get; set; }
  70. }

  1. /// <summary>
  2. /// 导航属性
  3. /// </summary>
  4. public static void NavigationPropertiesShow()
  5. {
  6. ConnectionConfig connectionConfig = new ConnectionConfig()
  7. {
  8. ConnectionString = CustomConnectionConfig.ConnectionString001,
  9. IsAutoCloseConnection = true,
  10. DbType = DbType.SqlServer
  11. };
  12. using (SqlSugarClient db = new SqlSugarClient(connectionConfig))
  13. {
  14. {
  15. db.Aop.OnLogExecuting = (s, p) =>
  16. {
  17. Console.WriteLine("----------------------------");
  18. Console.WriteLine($"Sql语句:{s}");
  19. };
  20. }
  21. #region 一对一关系
  22. {
  23. if (db.DbMaintenance.IsAnyTable("User", false))
  24. {
  25. db.DbMaintenance.DropTable<User>();
  26. }
  27. if (db.DbMaintenance.IsAnyTable("UserDetail", false))
  28. {
  29. db.DbMaintenance.DropTable<UserDetail>();
  30. }
  31. db.CodeFirst.InitTables<User>();
  32. db.CodeFirst.InitTables<UserDetail>();
  33. db.DeleteNav<User>(c => c.Id > 0)
  34. .Include(c => c.UserDetailInfo)
  35. .ExecuteCommand();
  36. List<User> users = new List<User>()
  37. {
  38. new User()
  39. {
  40. CompanyId = 1,
  41. UserName = "Richard",
  42. CreateTime = DateTime.Now,
  43. UserDetailInfo = new UserDetail()
  44. {
  45. Address = "湖北武汉",
  46. Description = ".NET金牌讲师"
  47. }
  48. },
  49. new User()
  50. {
  51. CompanyId = 1,
  52. UserName = "cole老师号",
  53. CreateTime = DateTime.Now,
  54. UserDetailInfo = new UserDetail()
  55. {
  56. Address = "湖北黄冈",
  57. Description = "金牌助教"
  58. }
  59. }
  60. };
  61. //导航属性新增
  62. bool bResult = db.InsertNav(users)
  63. .Include(z1 => z1.UserDetailInfo)
  64. .ExecuteCommand();
  65. //导航属性查询
  66. var list1 = db.Queryable<User>()
  67. .Includes(t => t.UserDetailInfo) //多层级
  68. .ToList();
  69. var list2 = db.Queryable<User>()
  70. .Includes(t => t.UserDetailInfo) //多层级
  71. .Where(c => c.UserName == "Richard")
  72. .ToList();
  73. list2[0].UserName = "Richard老师";
  74. list2[0].UserDetailInfo.Address = "湖北武汉汉阳";
  75. bool bResult1 = db.UpdateNav(list2)
  76. .Include(u => u.UserDetailInfo)
  77. .ExecuteCommand();
  78. bool bResult2 = db.DeleteNav<User>(list2)
  79. .Include(c => c.UserDetailInfo)
  80. .ExecuteCommand();
  81. }
  82. #endregion
  83. #region 一对多关系
  84. {
  85. if (db.DbMaintenance.IsAnyTable("User", false))
  86. {
  87. db.DbMaintenance.DropTable<User>();
  88. }
  89. if (db.DbMaintenance.IsAnyTable("Company", false))
  90. {
  91. db.DbMaintenance.DropTable<Company>();
  92. }
  93. db.CodeFirst.InitTables<Company>();
  94. db.CodeFirst.InitTables<User>();
  95. //导航删除
  96. db.DeleteNav<Company>(c => c.Id > 0)
  97. .Include(c => c.UserList)
  98. .ExecuteCommand();
  99. List<Company> companies = new List<Company>()
  100. {
  101. new Company()
  102. {
  103. CompanyName="朝夕教育",
  104. CreateTime= DateTime.Now,
  105. UserList=new List<User>(){
  106. new User()
  107. {
  108. CompanyId=1,
  109. CreateTime= DateTime.Now,
  110. UserName="Eleven"
  111. },
  112. new User()
  113. {
  114. CompanyId=1,
  115. CreateTime= DateTime.Now,
  116. UserName="Richard",
  117. UserDetailInfo=new UserDetail
  118. {
  119. Address="湖北武汉汉阳",
  120. Description="金牌讲师"
  121. }
  122. },
  123. new User()
  124. {
  125. CompanyId=1,
  126. CreateTime= DateTime.Now,
  127. UserName="Gerry"
  128. }
  129. }
  130. },
  131. new Company()
  132. {
  133. CompanyName="腾讯课堂",
  134. CreateTime= DateTime.Now,
  135. }
  136. };
  137. //导航新增
  138. db.InsertNav(companies)
  139. .Include(c => c.UserList)
  140. .ExecuteCommand();
  141. //一对多导航查询
  142. var list = db.Queryable<Company>()
  143. .Includes(t => t.UserList)
  144. .ToList();
  145. var userlist = db.Queryable<User>()
  146. .Includes(u => u.CompanyInfo)
  147. .ToList();
  148. var list1 = db.Queryable<Company>()
  149. .Includes(x => x.UserList.Where(u => u.UserName == "Richard").ToList())
  150. .Where(x => x.CompanyName.Contains("朝夕教育"))
  151. .ToList();
  152. list1[0].CompanyName = "朝夕教育-金牌机构";
  153. list1[0].UserList[0].UserName = "Richard老师";
  154. //修改
  155. bool bResult2 = db.UpdateNav(list1)
  156. .Include(u => u.UserList)
  157. .ExecuteCommand();
  158. ///删除
  159. bool bResult3 = db.DeleteNav(list1)
  160. .Include(u => u.UserList)
  161. .ExecuteCommand();
  162. }
  163. #endregion
  164. #region 多对多关系
  165. {
  166. if (db.DbMaintenance.IsAnyTable("User", false))
  167. {
  168. db.DbMaintenance.DropTable<User>();
  169. }
  170. if (db.DbMaintenance.IsAnyTable("Role", false))
  171. {
  172. db.DbMaintenance.DropTable<Role>();
  173. }
  174. if (db.DbMaintenance.IsAnyTable("UserRoleMapping", false))
  175. {
  176. db.DbMaintenance.DropTable<UserRoleMapping>();
  177. }
  178. db.CodeFirst.InitTables<User>();
  179. db.CodeFirst.InitTables<Role>();
  180. db.CodeFirst.InitTables<UserRoleMapping>();
  181. List<User> users = new List<User>()
  182. {
  183. new User()
  184. {
  185. CompanyId=1,
  186. CreateTime= DateTime.Now,
  187. UserName="Richard老师",
  188. RoleList=new List<Role>()
  189. {
  190. new Role()
  191. {
  192. CreateTime= DateTime.Now,
  193. RoleName="管理员"
  194. },
  195. new Role()
  196. {
  197. CreateTime= DateTime.Now,
  198. RoleName="金牌讲师"
  199. }
  200. }
  201. }
  202. };
  203. db.InsertNav(users)
  204. .Include(u => u.RoleList)// 插入第一层 SchoolA
  205. .ExecuteCommand();
  206. var list1 = db.Queryable<User>()
  207. .Includes(x => x.RoleList)
  208. .ToList();
  209. var list2 = db.Queryable<User>()
  210. .Includes(x => x.RoleList.Where(r => r.RoleName == "管理员").ToList())
  211. .Where(c => c.UserName.Equals("Richard老师"))
  212. .ToList();
  213. bool bResult = db.UpdateNav(list2)
  214. .Include(u => u.RoleList)
  215. .ExecuteCommand();
  216. bool bResult1 = db.DeleteNav(list1)
  217. .Include(u => u.RoleList)
  218. .ExecuteCommand();
  219. int iResult1 = db.Deleteable(list1).ExecuteCommand();
  220. var roles = db.Queryable<Role>()
  221. .ToList();
  222. int iResult2 = db.Deleteable(roles).ExecuteCommand();
  223. }
  224. #endregion
  225. #region 手动、指定字段、多字段
  226. {
  227. if (db.DbMaintenance.IsAnyTable("StudentA", false))
  228. {
  229. db.DbMaintenance.DropTable<StudentA>();
  230. }
  231. if (db.DbMaintenance.IsAnyTable("BookA", false))
  232. {
  233. db.DbMaintenance.DropTable<BookA>();
  234. }
  235. db.CodeFirst.InitTables<StudentA>();
  236. db.CodeFirst.InitTables<BookA>();
  237. List<StudentA> studentAs = new List<StudentA>()
  238. {
  239. new StudentA()
  240. {
  241. StudentId= 1,
  242. Name="张三同学",
  243. }
  244. };
  245. List<BookA> bookAs = new List<BookA>()
  246. {
  247. new BookA()
  248. {
  249. studenId= 1,
  250. Name="语文",
  251. },
  252. new BookA()
  253. {
  254. studenId= 1,
  255. Name="数学",
  256. }
  257. };
  258. db.Insertable(studentAs).ExecuteCommand();
  259. db.Insertable(bookAs).ExecuteCommand();
  260. var list = db.Queryable<StudentA>()
  261. .Includes(it => it.Books
  262. .MappingField(z => z.studenId, () => it.StudentId)
  263. .Where(z => z.BookId == 1)
  264. .ToList()
  265. )
  266. .ToList();
  267. }
  268. #endregion
  269. #region 性能优化,
  270. {
  271. if (db.DbMaintenance.IsAnyTable("User", false))
  272. {
  273. db.DbMaintenance.DropTable<User>();
  274. }
  275. if (db.DbMaintenance.IsAnyTable("Company", false))
  276. {
  277. db.DbMaintenance.DropTable<Company>();
  278. }
  279. db.CodeFirst.InitTables<Company>();
  280. db.CodeFirst.InitTables<User>();
  281. //导航删除
  282. db.DeleteNav<Company>(c => c.Id > 0)
  283. .Include(c => c.UserList)
  284. .ExecuteCommand();
  285. List<Company> companies = new List<Company>();
  286. for (int i = 0; i < 5000; i++)
  287. {
  288. Company company = new Company()
  289. {
  290. CompanyName = $"朝夕教育_{i}",
  291. CreateTime = DateTime.Now
  292. };
  293. List<User> userlist = new List<User>();
  294. for (int j = 0; j < 10; j++)
  295. {
  296. User user = new User()
  297. {
  298. CompanyId = 1,
  299. CreateTime = DateTime.Now,
  300. UserName = $"学员_{j}"
  301. };
  302. userlist.Add(user);
  303. }
  304. company.UserList = userlist;
  305. companies.Add(company);
  306. }
  307. db.InsertNav<Company>(companies)
  308. .Include(c => c.UserList)
  309. .ExecuteCommand();
  310. Console.WriteLine("====================================================================");
  311. Console.WriteLine("====================================================================");
  312. Console.WriteLine("====================================================================");
  313. Console.WriteLine("====================================================================");
  314. Console.WriteLine("====================================================================");
  315. List<Company> resultList = new List<Company>();
  316. db.Queryable<Company>()
  317. .Includes(it => it.UserList)
  318. .ForEach(it => resultList.Add(it), 300); //每次查询300条
  319. }
  320. #endregion
  321. #region 数据映射
  322. {
  323. AutoMapper
  324. List<Company> companies = db.Queryable<Company>()
  325. .Includes(it => it.UserList)
  326. .ToList(); //每次查询300条
  327. List<CompanyDto> dtoList = companies.Adapt<List<CompanyDto>>();
  328. }
  329. #endregion
  330. #region 导航方法
  331. {
  332. if (db.DbMaintenance.IsAnyTable("Company", false))
  333. {
  334. db.DbMaintenance.DropTable<Company>();
  335. }
  336. if (db.DbMaintenance.IsAnyTable("User", false))
  337. {
  338. db.DbMaintenance.DropTable<User>();
  339. }
  340. if (db.DbMaintenance.IsAnyTable("UserDetail", false))
  341. {
  342. db.DbMaintenance.DropTable<UserDetail>();
  343. }
  344. db.CodeFirst.InitTables<Company>();
  345. db.CodeFirst.InitTables<User>();
  346. db.CodeFirst.InitTables<UserDetail>();
  347. List<Company> companies = new List<Company>()
  348. {
  349. new Company()
  350. {
  351. CompanyName="朝夕教育",
  352. CreateTime= DateTime.Now,
  353. UserList=new List<User>(){
  354. new User()
  355. {
  356. CompanyId=1,
  357. CreateTime= DateTime.Now,
  358. UserName="Eleven"
  359. },
  360. new User()
  361. {
  362. CompanyId=1,
  363. CreateTime= DateTime.Now,
  364. UserName="Richard",
  365. UserDetailInfo=new UserDetail
  366. {
  367. Address="湖北武汉汉阳",
  368. Description="金牌讲师"
  369. }
  370. },
  371. new User()
  372. {
  373. CompanyId=1,
  374. CreateTime= DateTime.Now,
  375. UserName="Gerry"
  376. }
  377. }
  378. },
  379. new Company()
  380. {
  381. CompanyName="腾讯课堂",
  382. CreateTime= DateTime.Now,
  383. }
  384. };
  385. //导航新增
  386. db.InsertNav(companies)
  387. .Include(c => c.UserList)
  388. .ThenInclude(u => u.UserDetailInfo)
  389. .ExecuteCommand();
  390. Console.WriteLine("================================");
  391. List<Company> companyList1 = db.Queryable<Company>()
  392. //.Where(c=>c.UserList.Count()>0)
  393. .Where(it => it.UserList.Any())
  394. .ToList();
  395. List<Company> companyList2 = db.Queryable<Company>()
  396. .Where(it => it.UserList.Any(c => c.UserName.Equals("Richard")))
  397. .ToList();
  398. if (db.DbMaintenance.IsAnyTable("User", false))
  399. {
  400. db.DbMaintenance.DropTable<User>();
  401. }
  402. if (db.DbMaintenance.IsAnyTable("UserDetail", false))
  403. {
  404. db.DbMaintenance.DropTable<UserDetail>();
  405. }
  406. db.CodeFirst.InitTables<User>();
  407. db.CodeFirst.InitTables<UserDetail>();
  408. db.DeleteNav<User>(c => c.Id > 0)
  409. .Include(c => c.UserDetailInfo)
  410. .ExecuteCommand();
  411. List<User> users = new List<User>()
  412. {
  413. new User()
  414. {
  415. CompanyId = 1,
  416. UserName = "Richard",
  417. CreateTime = DateTime.Now,
  418. UserDetailInfo = new UserDetail()
  419. {
  420. Address = "湖北武汉",
  421. Description = ".NET金牌讲师"
  422. }
  423. },
  424. new User()
  425. {
  426. CompanyId = 1,
  427. UserName = "cole老师号",
  428. CreateTime = DateTime.Now,
  429. UserDetailInfo = new UserDetail()
  430. {
  431. Address = "湖北黄冈",
  432. Description = "金牌助教"
  433. }
  434. }
  435. };
  436. db.InsertNav(users).Include(c => c.CompanyInfo).ExecuteCommand();
  437. List<User> userlist = db.Queryable<User>()
  438. .Where(x => SqlFunc.Exists(x.UserDetailInfo.Id))
  439. .ToList();
  440. }
  441. #endregion
  442. #region 联表导航
  443. {
  444. Console.WriteLine("================联表导航=====================");
  445. if (db.DbMaintenance.IsAnyTable("StudentA", false))
  446. {
  447. db.DbMaintenance.DropTable<StudentA>();
  448. }
  449. if (db.DbMaintenance.IsAnyTable("RoomA", false))
  450. {
  451. db.DbMaintenance.DropTable<RoomA>();
  452. }
  453. if (db.DbMaintenance.IsAnyTable("SchoolA", false))
  454. {
  455. db.DbMaintenance.DropTable<SchoolA>();
  456. }
  457. if (db.DbMaintenance.IsAnyTable("TeacherA", false))
  458. {
  459. db.DbMaintenance.DropTable<TeacherA>();
  460. }
  461. db.CodeFirst.InitTables<StudentA, RoomA, SchoolA, TeacherA>();
  462. db.DbMaintenance.TruncateTable<StudentA>();
  463. db.DbMaintenance.TruncateTable<RoomA>();
  464. db.DbMaintenance.TruncateTable<SchoolA>();
  465. db.DbMaintenance.TruncateTable<TeacherA>();
  466. db.Insertable(new RoomA() { RoomId = 1, RoomName = "北大001室", SchoolId = 1 }).ExecuteCommand();
  467. db.Insertable(new RoomA() { RoomId = 2, RoomName = "北大002室", SchoolId = 1 }).ExecuteCommand();
  468. db.Insertable(new RoomA() { RoomId = 3, RoomName = "北大003室", SchoolId = 1 }).ExecuteCommand();
  469. db.Insertable(new RoomA() { RoomId = 4, RoomName = "清华001厅", SchoolId = 2 }).ExecuteCommand();
  470. db.Insertable(new RoomA() { RoomId = 5, RoomName = "清华002厅", SchoolId = 2 }).ExecuteCommand();
  471. db.Insertable(new RoomA() { RoomId = 6, RoomName = "清华003厅", SchoolId = 2 }).ExecuteCommand();
  472. db.Insertable(new SchoolA() { SchoolId = 1, SchoolName = "北大" }).ExecuteCommand();
  473. db.Insertable(new SchoolA() { SchoolId = 2, SchoolName = "清华" }).ExecuteCommand();
  474. db.Insertable(new StudentA() { StudentId = 1, SchoolId = 1, Name = "北大jack" }).ExecuteCommand();
  475. db.Insertable(new StudentA() { StudentId = 2, SchoolId = 1, Name = "北大tom" }).ExecuteCommand();
  476. db.Insertable(new StudentA() { StudentId = 3, SchoolId = 2, Name = "清华jack" }).ExecuteCommand();
  477. db.Insertable(new StudentA() { StudentId = 4, SchoolId = 2, Name = "清华tom" }).ExecuteCommand();
  478. db.Insertable(new TeacherA() { SchoolId = 1, Id = 1, Name = "北大老师01" }).ExecuteCommand();
  479. db.Insertable(new TeacherA() { SchoolId = 1, Id = 2, Name = "北大老师02" }).ExecuteCommand();
  480. db.Insertable(new TeacherA() { SchoolId = 2, Id = 3, Name = "清华老师01" }).ExecuteCommand();
  481. db.Insertable(new TeacherA() { SchoolId = 2, Id = 4, Name = "清华老师02" }).ExecuteCommand();
  482. Console.WriteLine("=================================================");
  483. var list = db.Queryable<StudentA>().ToList();//这儿也可以联表查询
  484. //var list1 = db.Queryable<StudentA>().Includes(c=>c.SchoolA).ToList();//这儿也可以联表查询
  485. db.ThenMapper(list, stu =>
  486. {
  487. //如果加Where不能带有stu参数,stu参数写到 SetContext
  488. stu.SchoolA = db.Queryable<SchoolA>().SetContext(scl => scl.SchoolId, () => stu.SchoolId, stu).FirstOrDefault();
  489. });
  490. }
  491. #endregion
  492. #region 实现无限层--树
  493. {
  494. if (db.DbMaintenance.IsAnyTable("Tree", false))
  495. {
  496. db.DbMaintenance.DropTable<Tree>();
  497. }
  498. db.CodeFirst.InitTables<Tree>();
  499. Tree tree = new Tree()
  500. {
  501. Id = 1,
  502. Name = "一级树",
  503. ParentId = 0,
  504. Child = new List<Tree>
  505. {
  506. new Tree()
  507. {
  508. ParentId=1,
  509. Id = 5,
  510. Name="二级目录-1",
  511. Child=new List<Tree>
  512. {
  513. new Tree() {
  514. Id = 6,
  515. Name="三级目录-1",
  516. ParentId=2,
  517. Child=new List<Tree>
  518. {
  519. new Tree() {
  520. Id = 7,
  521. ParentId=6,
  522. Name="四级目录-1"
  523. }
  524. }
  525. }
  526. }
  527. }
  528. }
  529. };
  530. db.InsertNav<Tree>(tree)
  531. .Include(it => it.Child)
  532. .ThenInclude(c => c.Child)
  533. .ThenInclude(c1 => c1.Child)
  534. .ThenInclude(c2 => c2.Child)
  535. .ExecuteCommand();
  536. var treeRoot = db.Queryable<Tree>().Where(it => it.Id == 1).ToList();
  537. //第一层
  538. db.ThenMapper(treeRoot, item =>
  539. {
  540. item.Child = db.Queryable<Tree>().SetContext(x => x.ParentId, () => item.Id, item).ToList();
  541. });
  542. //第二层
  543. db.ThenMapper(treeRoot.SelectMany(it => it.Child), it =>
  544. {
  545. it.Child = db.Queryable<Tree>().SetContext(x => x.ParentId, () => it.Id, it).ToList();
  546. });
  547. //第三层
  548. db.ThenMapper(treeRoot.SelectMany(it => it.Child).SelectMany(it => it.Child), it =>
  549. {
  550. it.Child = db.Queryable<Tree>().SetContext(x => x.ParentId, () => it.Id, it).ToList();
  551. });
  552. List<Tree> list = db.Queryable<Tree>().ToTree(it => it.Child, it => it.ParentId, 0);
  553. }
  554. #endregion
  555. }
  556. }

3.10、导航属性性能优化

  1. db.ThenMapper(list, stu =>
  2. {
  3. //如果加Where不能带有stu参数,stu参数写到 SetContext
  4. stu.SchoolA = db.Queryable<SchoolA>().SetContext(scl => scl.SchoolId, () =>
  5. stu.SchoolId, stu).FirstOrDefault();
  6. //可以联查询的
  7. //stu.xxxx=db.Queryable<SchoolA>().LeftJoin<XXX>
  8. ().Select(xxxx).SetContext(....).ToList();
  9. });

  1. #region 性能优化,
  2. {
  3. if (db.DbMaintenance.IsAnyTable("User", false))
  4. {
  5. db.DbMaintenance.DropTable<User>();
  6. }
  7. if (db.DbMaintenance.IsAnyTable("Company", false))
  8. {
  9. db.DbMaintenance.DropTable<Company>();
  10. }
  11. db.CodeFirst.InitTables<Company>();
  12. db.CodeFirst.InitTables<User>();
  13. //导航删除
  14. db.DeleteNav<Company>(c => c.Id > 0)
  15. .Include(c => c.UserList)
  16. .ExecuteCommand();
  17. List<Company> companies = new List<Company>();
  18. for (int i = 0; i < 5000; i++)
  19. {
  20. Company company = new Company()
  21. {
  22. CompanyName = $"朝夕教育_{i}",
  23. CreateTime = DateTime.Now
  24. };
  25. List<User> userlist = new List<User>();
  26. for (int j = 0; j < 10; j++)
  27. {
  28. User user = new User()
  29. {
  30. CompanyId = 1,
  31. CreateTime = DateTime.Now,
  32. UserName = $"学员_{j}"
  33. };
  34. userlist.Add(user);
  35. }
  36. company.UserList = userlist;
  37. companies.Add(company);
  38. }
  39. db.InsertNav<Company>(companies)
  40. .Include(c => c.UserList)
  41. .ExecuteCommand();
  42. Console.WriteLine("====================================================================");
  43. Console.WriteLine("====================================================================");
  44. Console.WriteLine("====================================================================");
  45. Console.WriteLine("====================================================================");
  46. Console.WriteLine("====================================================================");
  47. List<Company> resultList = new List<Company>();
  48. db.Queryable<Company>()
  49. .Includes(it => it.UserList)
  50. .ForEach(it => resultList.Add(it), 300); //每次查询300
  51. }
  52. #endregion
导航属性,分段查询
如果数据库中数据量偏大,且查询的数据量偏大,可以分段查询,一次查询多少条,继续往后执行查询
多少条;

3.11、查询映射

数据库中返回的数据是一个Model--实体-返回给客户端---User---UserDto---Autommper 对于大部分开发者,如果需要做集合的映射,实体映射,都会想到Automapper。
SqlSugar有一个工具:Mapster
nuget引入Mapster
  1. List<Company> companies= db.Queryable<Company>()
  2. .Includes(it => it.UserList)
  3. .ToList(); //每次查询300条
  4. var dtoList = companies.Adapt<List<CompanyDto>>();
  1. #region 数据映射
  2. {
  3. AutoMapper
  4. List<Company> companies = db.Queryable<Company>()
  5. .Includes(it => it.UserList)
  6. .ToList(); //每次查询300
  7. List<CompanyDto> dtoList = companies.Adapt<List<CompanyDto>>();
  8. }
  9. #endregion

3.12、导航方法

Any
SqlFunc.Exists
  1. List<Company> companyList1 = db.Queryable<Company>()
  2. .Where(it => it.UserList.Any())
  3. .ToList();
  4. List<Company> companyList2 = db.Queryable<Company>()
  5. .Where(it => it.UserList.Any(c => c.UserName.Equals("Richard")))
  6. .ToList();
  1. #region 导航方法
  2. {
  3. if (db.DbMaintenance.IsAnyTable("Company", false))
  4. {
  5. db.DbMaintenance.DropTable<Company>();
  6. }
  7. if (db.DbMaintenance.IsAnyTable("User", false))
  8. {
  9. db.DbMaintenance.DropTable<User>();
  10. }
  11. if (db.DbMaintenance.IsAnyTable("UserDetail", false))
  12. {
  13. db.DbMaintenance.DropTable<UserDetail>();
  14. }
  15. db.CodeFirst.InitTables<Company>();
  16. db.CodeFirst.InitTables<User>();
  17. db.CodeFirst.InitTables<UserDetail>();
  18. List<Company> companies = new List<Company>()
  19. {
  20. new Company()
  21. {
  22. CompanyName="朝夕教育",
  23. CreateTime= DateTime.Now,
  24. UserList=new List<User>(){
  25. new User()
  26. {
  27. CompanyId=1,
  28. CreateTime= DateTime.Now,
  29. UserName="Eleven"
  30. },
  31. new User()
  32. {
  33. CompanyId=1,
  34. CreateTime= DateTime.Now,
  35. UserName="Richard",
  36. UserDetailInfo=new UserDetail
  37. {
  38. Address="湖北武汉汉阳",
  39. Description="金牌讲师"
  40. }
  41. },
  42. new User()
  43. {
  44. CompanyId=1,
  45. CreateTime= DateTime.Now,
  46. UserName="Gerry"
  47. }
  48. }
  49. },
  50. new Company()
  51. {
  52. CompanyName="腾讯课堂",
  53. CreateTime= DateTime.Now,
  54. }
  55. };
  56. //导航新增
  57. db.InsertNav(companies)
  58. .Include(c => c.UserList)
  59. .ThenInclude(u => u.UserDetailInfo)
  60. .ExecuteCommand();
  61. Console.WriteLine("================================");
  62. List<Company> companyList1 = db.Queryable<Company>()
  63. //.Where(c=>c.UserList.Count()>0)
  64. .Where(it => it.UserList.Any())
  65. .ToList();
  66. List<Company> companyList2 = db.Queryable<Company>()
  67. .Where(it => it.UserList.Any(c => c.UserName.Equals("Richard")))
  68. .ToList();
  69. if (db.DbMaintenance.IsAnyTable("User", false))
  70. {
  71. db.DbMaintenance.DropTable<User>();
  72. }
  73. if (db.DbMaintenance.IsAnyTable("UserDetail", false))
  74. {
  75. db.DbMaintenance.DropTable<UserDetail>();
  76. }
  77. db.CodeFirst.InitTables<User>();
  78. db.CodeFirst.InitTables<UserDetail>();
  79. db.DeleteNav<User>(c => c.Id > 0)
  80. .Include(c => c.UserDetailInfo)
  81. .ExecuteCommand();
  82. List<User> users = new List<User>()
  83. {
  84. new User()
  85. {
  86. CompanyId = 1,
  87. UserName = "Richard",
  88. CreateTime = DateTime.Now,
  89. UserDetailInfo = new UserDetail()
  90. {
  91. Address = "湖北武汉",
  92. Description = ".NET金牌讲师"
  93. }
  94. },
  95. new User()
  96. {
  97. CompanyId = 1,
  98. UserName = "cole老师号",
  99. CreateTime = DateTime.Now,
  100. UserDetailInfo = new UserDetail()
  101. {
  102. Address = "湖北黄冈",
  103. Description = "金牌助教"
  104. }
  105. }
  106. };
  107. db.InsertNav(users).Include(c => c.CompanyInfo).ExecuteCommand();
  108. List<User> userlist = db.Queryable<User>()
  109. .Where(x => SqlFunc.Exists(x.UserDetailInfo.Id))
  110. .ToList();
  111. }
  112. #endregion

3.13、ThenMapper方法使用

  1. db.ThenMapper(list, stu =>
  2. {
  3. //如果加Where不能带有stu参数,stu参数写到 SetContext
  4. stu.SchoolA = db.Queryable<SchoolA>().SetContext(scl => scl.SchoolId, () =>
  5. stu.SchoolId, stu).FirstOrDefault();
  6. //可以联查询的
  7. //stu.xxxx=db.Queryable<SchoolA>().LeftJoin<XXX>
  8. ().Select(xxxx).SetContext(....).ToList();
  9. });
  1. #region 联表导航
  2. {
  3. Console.WriteLine("================联表导航=====================");
  4. if (db.DbMaintenance.IsAnyTable("StudentA", false))
  5. {
  6. db.DbMaintenance.DropTable<StudentA>();
  7. }
  8. if (db.DbMaintenance.IsAnyTable("RoomA", false))
  9. {
  10. db.DbMaintenance.DropTable<RoomA>();
  11. }
  12. if (db.DbMaintenance.IsAnyTable("SchoolA", false))
  13. {
  14. db.DbMaintenance.DropTable<SchoolA>();
  15. }
  16. if (db.DbMaintenance.IsAnyTable("TeacherA", false))
  17. {
  18. db.DbMaintenance.DropTable<TeacherA>();
  19. }
  20. db.CodeFirst.InitTables<StudentA, RoomA, SchoolA, TeacherA>();
  21. db.DbMaintenance.TruncateTable<StudentA>();
  22. db.DbMaintenance.TruncateTable<RoomA>();
  23. db.DbMaintenance.TruncateTable<SchoolA>();
  24. db.DbMaintenance.TruncateTable<TeacherA>();
  25. db.Insertable(new RoomA() { RoomId = 1, RoomName = "北大001室", SchoolId = 1 }).ExecuteCommand();
  26. db.Insertable(new RoomA() { RoomId = 2, RoomName = "北大002室", SchoolId = 1 }).ExecuteCommand();
  27. db.Insertable(new RoomA() { RoomId = 3, RoomName = "北大003室", SchoolId = 1 }).ExecuteCommand();
  28. db.Insertable(new RoomA() { RoomId = 4, RoomName = "清华001厅", SchoolId = 2 }).ExecuteCommand();
  29. db.Insertable(new RoomA() { RoomId = 5, RoomName = "清华002厅", SchoolId = 2 }).ExecuteCommand();
  30. db.Insertable(new RoomA() { RoomId = 6, RoomName = "清华003厅", SchoolId = 2 }).ExecuteCommand();
  31. db.Insertable(new SchoolA() { SchoolId = 1, SchoolName = "北大" }).ExecuteCommand();
  32. db.Insertable(new SchoolA() { SchoolId = 2, SchoolName = "清华" }).ExecuteCommand();
  33. db.Insertable(new StudentA() { StudentId = 1, SchoolId = 1, Name = "北大jack" }).ExecuteCommand();
  34. db.Insertable(new StudentA() { StudentId = 2, SchoolId = 1, Name = "北大tom" }).ExecuteCommand();
  35. db.Insertable(new StudentA() { StudentId = 3, SchoolId = 2, Name = "清华jack" }).ExecuteCommand();
  36. db.Insertable(new StudentA() { StudentId = 4, SchoolId = 2, Name = "清华tom" }).ExecuteCommand();
  37. db.Insertable(new TeacherA() { SchoolId = 1, Id = 1, Name = "北大老师01" }).ExecuteCommand();
  38. db.Insertable(new TeacherA() { SchoolId = 1, Id = 2, Name = "北大老师02" }).ExecuteCommand();
  39. db.Insertable(new TeacherA() { SchoolId = 2, Id = 3, Name = "清华老师01" }).ExecuteCommand();
  40. db.Insertable(new TeacherA() { SchoolId = 2, Id = 4, Name = "清华老师02" }).ExecuteCommand();
  41. Console.WriteLine("=================================================");
  42. var list = db.Queryable<StudentA>().ToList();//这儿也可以联表查询
  43. //var list1 = db.Queryable<StudentA>().Includes(c=>c.SchoolA).ToList();//这儿也可以联表查询
  44. db.ThenMapper(list, stu =>
  45. {
  46. //如果加Where不能带有stu参数,stu参数写到 SetContext
  47. stu.SchoolA = db.Queryable<SchoolA>().SetContext(scl => scl.SchoolId, () => stu.SchoolId, stu).FirstOrDefault();
  48. });
  49. }
  50. #endregion

3.14、ThenMapper查询树

  1. var treeRoot = db.Queryable<Tree>().Where(it => it.Id == 1).ToList();
  2. //第一层
  3. db.ThenMapper(treeRoot, item =>
  4. {
  5. item.Child = db.Queryable<Tree>().SetContext(x => x.ParentId, () =>
  6. item.Id, item).ToList();
  7. });
  8. //第二层

3.15、树操作

无需依赖导航属性
设置关联字段即可
  1. public class Tree
  2. {
  3. [SugarColumn(IsPrimaryKey = true)]
  4. public int Id { get; set; }
  5. public string? Name { get; set; }
  6. public int ParentId { get; set; } //在树查询中Parentid 是特殊的;
  7. [SugarColumn(IsIgnore = true)]
  8. [Navigate(NavigateType.OneToMany, nameof(ParentId))]//设置导航 一对一
  9. public List<Tree>? Child { get; set; }
  10. }
实现无限层--树 
  1. #region 实现无限层--树
  2. {
  3. if (db.DbMaintenance.IsAnyTable("Tree", false))
  4. {
  5. db.DbMaintenance.DropTable<Tree>();
  6. }
  7. db.CodeFirst.InitTables<Tree>();
  8. Tree tree = new Tree()
  9. {
  10. Id = 1,
  11. Name = "一级树",
  12. ParentId = 0,
  13. Child = new List<Tree>
  14. {
  15. new Tree()
  16. {
  17. ParentId=1,
  18. Id = 5,
  19. Name="二级目录-1",
  20. Child=new List<Tree>
  21. {
  22. new Tree() {
  23. Id = 6,
  24. Name="三级目录-1",
  25. ParentId=2,
  26. Child=new List<Tree>
  27. {
  28. new Tree() {
  29. Id = 7,
  30. ParentId=6,
  31. Name="四级目录-1"
  32. }
  33. }
  34. }
  35. }
  36. }
  37. }
  38. };
  39. db.InsertNav<Tree>(tree)
  40. .Include(it => it.Child)
  41. .ThenInclude(c => c.Child)
  42. .ThenInclude(c1 => c1.Child)
  43. .ThenInclude(c2 => c2.Child)
  44. .ExecuteCommand();
  45. var treeRoot = db.Queryable<Tree>().Where(it => it.Id == 1).ToList();
  46. //第一层
  47. db.ThenMapper(treeRoot, item =>
  48. {
  49. item.Child = db.Queryable<Tree>().SetContext(x => x.ParentId, () => item.Id, item).ToList();
  50. });
  51. //第二层
  52. db.ThenMapper(treeRoot.SelectMany(it => it.Child), it =>
  53. {
  54. it.Child = db.Queryable<Tree>().SetContext(x => x.ParentId, () => it.Id, it).ToList();
  55. });
  56. //第三层
  57. db.ThenMapper(treeRoot.SelectMany(it => it.Child).SelectMany(it => it.Child), it =>
  58. {
  59. it.Child = db.Queryable<Tree>().SetContext(x => x.ParentId, () => it.Id, it).ToList();
  60. });
  61. List<Tree> list = db.Queryable<Tree>().ToTree(it => it.Child, it => it.ParentId, 0);
  62. }
  63. #endregion

----------------------------------------------------------------------------by202407150153-------

树递归查询


        //设置关联字段 
        [SugarColumn(IsTreeKey = true)]
        public string? Code { get; set; }

        [SugarColumn(IsTreeKey = true)]
        public string? ParentCode { get; set; }   //父级字段

  1. #region 树递归查询
  2. {
  3. //if (db.DbMaintenance.IsAnyTable("Tree", false))
  4. //{
  5. // db.DbMaintenance.DropTable<Tree>();
  6. //}
  7. //db.CodeFirst.InitTables<Tree>();
  8. //Tree tree = new Tree()
  9. //{
  10. // Id = 1,
  11. // Name = "一级树",
  12. // ParentId = 0,
  13. // Child = new List<Tree>
  14. // {
  15. // new Tree()
  16. // {
  17. // ParentId=1,
  18. // Id = 5,
  19. // Name="二级目录-1",
  20. // Child=new List<Tree>
  21. // {
  22. // new Tree() {
  23. // Id = 6,
  24. // Name="三级目录-1",
  25. // ParentId=2,
  26. // Child=new List<Tree>
  27. // {
  28. // new Tree() {
  29. // Id = 7,
  30. // ParentId=6,
  31. // Name="四级目录-1"
  32. // }
  33. // }
  34. // }
  35. // }
  36. // }
  37. // }
  38. //};
  39. //db.InsertNav<Tree>(tree)
  40. // .Include(it => it.Child)
  41. // .ThenInclude(c => c.Child)
  42. // .ThenInclude(c1 => c1.Child)
  43. // .ThenInclude(c2 => c2.Child)
  44. // .ExecuteCommand();
  45. 查询所有下级
  46. 从ParentId 为0 开始查询下级
  47. //List<Tree> childlist = db.Queryable<Tree>().ToTree(it => it.Child, it => it.ParentId, 0);
  48. 查询所有上级
  49. //List<Tree> parentlist = db.Queryable<Tree>().ToParentList(it => it.ParentId, 6);
  50. 条件查询,树形查询
  51. //List<Tree> treelist = db.Queryable<Tree>().Where(it => it.ParentId > 5)
  52. // .ToTree(it => it.Child, it => it.ParentId, 0);
  53. //if (db.DbMaintenance.IsAnyTable("Tree2", false))
  54. //{
  55. // db.DbMaintenance.DropTable<Tree2>();
  56. //}
  57. //db.CodeFirst.InitTables<Tree2>();
  58. //List<Tree2> tree2addlist = new List<Tree2>()
  59. //{
  60. // new Tree2()
  61. // {
  62. // Name = "一级树",
  63. // ParentCode ="",
  64. // Code="001"
  65. // },
  66. // new Tree2()
  67. // {
  68. // ParentCode="001",
  69. // Name="二级目录-1",
  70. // Code="002"
  71. // },
  72. // new Tree2()
  73. // {
  74. // Name="三级目录-1",
  75. // ParentCode="002",
  76. // Code="003"
  77. // },
  78. // new Tree2()
  79. // {
  80. // ParentCode="003",
  81. // Name="四级目录-1",
  82. // Code="004"
  83. // }
  84. //};
  85. //db.Insertable<Tree2>(tree2addlist)
  86. // .ExecuteCommand();
  87. //List<Tree2> child21list = db.Queryable<Tree2>().ToTree(it => it.Child, it => it.ParentCode, "001");
  88. //List<Tree2> child22list = db.Queryable<Tree2>().ToTree(it => it.Child, it => it.ParentCode, "002");
  89. 查询所有上级
  90. //List<Tree2> parent2list = db.Queryable<Tree2>().ToParentList(it => it.Child, "004");
  91. 条件查询,树形查询
  92. //List<Tree2> tree2list = db.Queryable<Tree2>().Where(it => it.Name.Contains("目录"))
  93. // .ToTree(it => it.Child, it => it.ParentCode, "001");
  94. }
  95. #endregion

3.16、动态表达式

数据结构,可以又多个表达式组合成一个表达式,也可以把表达式拆解---->组建成sql语句;
动态表达式
拓展用例
Queryable.Or
表达式解析器解析表达式
Where条件解析
select解析
字段名称解析
  1. #region 表达式目录树
  2. {
  3. //表达式目录树连写
  4. {
  5. Console.WriteLine("========================================================================");
  6. string CompanyName = "";
  7. int? id = 1;
  8. //用例1:连写 不等于空 后面
  9. Expression<Func<Company, bool>> exp = Expressionable.Create<Company>() //创建表达式
  10. .AndIF(string.IsNullOrWhiteSpace(CompanyName) == false, it => it.CompanyName == CompanyName)
  11. .AndIF(id != null, it => it.Id == id)
  12. .ToExpression();//注意 这一句 不能少
  13. var list = db.Queryable<Company>()
  14. .Where(exp)
  15. .ToList();//直接用就行了不需要判段 null和加true
  16. }
  17. //表达式目录树分开写
  18. {
  19. Console.WriteLine("========================================================================");
  20. string CompanyName = "音娱乐行";
  21. int? id = 1;
  22. Expressionable<Company> expable = Expressionable.Create<Company>();
  23. if (string.IsNullOrWhiteSpace(CompanyName) == false)
  24. {
  25. expable.And(it => it.CompanyName == CompanyName);
  26. }
  27. if (id != null)
  28. {
  29. expable.And(it => it.CompanyName == CompanyName);
  30. }
  31. Expression<Func<Company, bool>> exp = expable.ToExpression();//要用变量 var exp=
  32. db.Queryable<Company>().Where(exp).ToList();//直接用就行了不需要判段 null和加true
  33. }
  34. //拓展用例
  35. {
  36. Console.WriteLine("========================================================================");
  37. var names = new string[] { "音娱乐行", "乐善其行" };
  38. Expressionable<Company> exp = Expressionable.Create<Company>();
  39. foreach (var item in names)
  40. {
  41. exp.Or(it => it.CompanyName.Contains(item.ToString()));
  42. }
  43. var list = db.Queryable<Company>().Where(exp.ToExpression()).ToList();
  44. }
  45. // Queyable.Or
  46. {
  47. Console.WriteLine("========================================================================");
  48. var exp = Expressionable.Create<Company>()
  49. .And(it => it.Id == 1)
  50. .Or(it => it.Id == 100)
  51. .ToExpression();//注意 这一句 不能少
  52. var list = db.Queryable<Company>().Where(exp).ToList();
  53. }
  54. //解析表达式目录树
  55. {
  56. Console.WriteLine("========================================================================");
  57. var expContext = new SqlServerExpressionContext();
  58. Expression<Func<Company, bool>> exp = c => c.CompanyName.Contains("朝夕教育");
  59. expContext.Resolve(exp, ResolveExpressType.WhereSingle);
  60. var wheresql = expContext.Result.GetString();
  61. var pars = expContext.Parameters;
  62. db.Queryable<Company>().Where(wheresql).AddParameters(pars).ToList();
  63. }
  64. //匿名表达式解析
  65. {
  66. Console.WriteLine("========================================================================");
  67. DbType dbtype = DbType.SqlServer;
  68. ExpressionContext expContext = null;
  69. switch (dbtype)
  70. {
  71. case DbType.MySql:
  72. expContext = new MySqlExpressionContext();
  73. break;
  74. case DbType.SqlServer:
  75. expContext = new SqlServerExpressionContext();
  76. break;
  77. case DbType.Sqlite:
  78. expContext = new SqliteExpressionContext();
  79. break;
  80. case DbType.Oracle:
  81. expContext = new OracleExpressionContext();
  82. break;
  83. case DbType.PostgreSQL:
  84. expContext = new PostgreSQLExpressionContext();
  85. break;
  86. case DbType.Dm:
  87. expContext = new DmExpressionContext();
  88. break;
  89. case DbType.Kdbndp:
  90. expContext = new KdbndpExpressionContext();
  91. break;
  92. default:
  93. throw new Exception("不支持");
  94. }
  95. Expression<Func<Company, bool>> exp = c => c.CompanyName.Contains("朝夕教育");
  96. expContext.Resolve(exp, ResolveExpressType.WhereSingle);
  97. var wheresql = expContext.Result.GetString();
  98. var pars = expContext.Parameters;
  99. db.Queryable<Company>().Where(wheresql).AddParameters(pars).ToList();
  100. }
  101. #region Where条件解析
  102. {
  103. Console.WriteLine("========================================================================");
  104. var expContext = new SqlServerExpressionContext();
  105. Expression<Func<Company, bool>> exp = it => it.CompanyName.Contains("音娱乐行");
  106. expContext.Resolve(exp, ResolveExpressType.WhereSingle);
  107. var value = expContext.Result.GetString();
  108. var pars = expContext.Parameters;
  109. }
  110. #endregion
  111. #region Where-Like解析
  112. {
  113. Console.WriteLine("========================================================================");
  114. Expression<Func<Student, bool>> exp = it => it.Name.Contains("Richard老师");
  115. ExpressionContext expContext = new ExpressionContext();
  116. expContext.Resolve(exp, ResolveExpressType.WhereMultiple);
  117. var value = expContext.Result.GetString();
  118. var pars = expContext.Parameters;
  119. }
  120. #endregion
  121. #region Select的解析
  122. {
  123. Console.WriteLine("========================================================================");
  124. Expression<Func<Company, CompanyDto>> exp = it => new CompanyDto()
  125. {
  126. CompanyName = it.CompanyName,
  127. CreateTime = it.CreateTime,
  128. };
  129. ExpressionContext expContext = new ExpressionContext();
  130. expContext.IsSingle = false;
  131. expContext.Resolve(exp, ResolveExpressType.SelectSingle);
  132. var selectorValue = expContext.Result.GetString();
  133. var pars = expContext.Parameters;
  134. }
  135. #endregion
  136. }
  137. #endregion

3.17、跨库查询

在开发中,避免不了会有多个数据库存储数据。
如果在分库后,涉及到业务数据的链接查询,A库,B库;
从业务上让A库和B库链接查询;
使用SqlServer同义词;
  1. #region 跨库查询
  2. {
  3. List<ConnectionConfig> connetctionlist = new List<ConnectionConfig>()
  4. {
  5. new ConnectionConfig()
  6. {
  7. ConfigId="db1",
  8. DbType=DbType.SqlServer,
  9. ConnectionString=CustomConnectionConfig.ConnectionString001,
  10. IsAutoCloseConnection=true
  11. },
  12. new ConnectionConfig()
  13. {
  14. ConfigId="db2",
  15. DbType=DbType.SqlServer,
  16. ConnectionString=CustomConnectionConfig.ConnectionString003,
  17. IsAutoCloseConnection=true
  18. }
  19. };
  20. using (SqlSugarClient db = new SqlSugarClient(connetctionlist))
  21. {
  22. {
  23. db.Aop.OnLogExecuting = (s, p) =>
  24. {
  25. Console.WriteLine("----------------------------");
  26. Console.WriteLine($"Sql语句:{s}");
  27. };
  28. }
  29. db.GetConnection("db1").DbMaintenance.CreateDatabase();
  30. db.GetConnection("db2").DbMaintenance.CreateDatabase();
  31. if (db.GetConnection("db1").DbMaintenance.IsAnyTable("OrderHead", false))
  32. {
  33. db.GetConnection("db1").DbMaintenance.DropTable<OrderHead>();
  34. }
  35. if (db.GetConnection("db2").DbMaintenance.IsAnyTable("OrderItem", false))
  36. {
  37. db.GetConnection("db2").DbMaintenance.DropTable<OrderItem>();
  38. }
  39. db.GetConnection("db1").CodeFirst.InitTables<OrderHead>();
  40. db.GetConnection("db2").CodeFirst.InitTables<OrderItem>();
  41. List<OrderHead> orders = new List<OrderHead>()
  42. {
  43. new OrderHead(){
  44. Id= 1,
  45. Name="自行车订单",
  46. Price=3000,
  47. CreateTime=DateTime.Now,
  48. CountInfo=1,
  49. }
  50. };
  51. List<OrderItem> itemsList = new List<OrderItem>()
  52. {
  53. new OrderItem()
  54. {
  55. CreateTime=DateTime.Now,
  56. Price=2900,
  57. ItemId=1,
  58. OrderId=1,
  59. },
  60. new OrderItem()
  61. {
  62. CreateTime=DateTime.Now,
  63. Price=100,
  64. ItemId=2,
  65. OrderId=1,
  66. }
  67. };
  68. db.GetConnection("db1").Insertable(orders)
  69. .ExecuteCommand();
  70. db.GetConnection("db2").Insertable(itemsList)
  71. .ExecuteCommand();
  72. //通过实体类特性Tenant自动映射不同数据库进行查询
  73. {
  74. var list = db.QueryableWithAttr<OrderItem>()
  75. .Includes(z => z.Order)
  76. .ToList(); //1行代码就搞定了2个库联表查询
  77. var list1 = db.QueryableWithAttr<OrderHead>()
  78. .Includes(z => z.Items)
  79. .ToList(); //1行代码就搞定了2个库联表查询
  80. }
  81. //不通过特性实现跨库导航
  82. {
  83. var list = db.GetConnection("db2").Queryable<OrderItem>()//Orderitem是db2
  84. .CrossQuery(typeof(OrderHead), "db1")//Order是db1
  85. .Includes(z => z.Order)
  86. .ToList();
  87. var list1 = db.GetConnection("db1").Queryable<OrderHead>()//Orderitem是db2
  88. .CrossQuery(typeof(OrderItem), "db2")//Order是db1
  89. .Includes(z => z.Items)
  90. .ToList();
  91. }
  92. {
  93. var list = db.Queryable<OrderHead>().AS("ZhaoxiSqlSugarDb.dbo.OrderHead").ToList();
  94. //多表跨库
  95. var list1 = db.Queryable<OrderHead>().AS("ZhaoxiSqlSugarDb.dbo.OrderHead") // AS("")
  96. .LeftJoin<OrderItem>((o, i) => o.Id == i.OrderId).AS<OrderItem>("ZhaoxiSqlSugarDb_Item.dbo.OrderItem") //AS<T>
  97. .ToList();
  98. }
  99. }
  100. }
  101. #endregion

3.18、报表查询

在开发中,对于一些报表数据,如果使用Sql语句去查询,很复杂,Sqlsugar轻松支持
统计当前年份数据
统计最近三年的数据
统计最近十年的数据
统计今年一月份数据
统计最近三年一月份数据
统计最近10年一月份数据
  1. #region 初始化表结构和数据
  2. {
  3. db.Aop.OnLogExecuting = (s, p) =>
  4. {
  5. Console.WriteLine("----------------------------");
  6. Console.WriteLine($"Sql语句:{s}");
  7. };
  8. if (db.DbMaintenance.IsAnyTable("Operateinfo", false))
  9. {
  10. db.DbMaintenance.DropTable<Operateinfo>();
  11. }
  12. db.CodeFirst.InitTables<Operateinfo>();
  13. List<Operateinfo> list = new List<Operateinfo>();
  14. for (int i = 0; i < 100000; i++)
  15. {
  16. list.Add(new Operateinfo()
  17. {
  18. Operate_time = DateTime.Now.AddMonths(new Random().Next(-6, 6)).AddYears(new Random().Next(-20, 20)),
  19. Operate_Type = i,
  20. Userid = i,
  21. });
  22. }
  23. db.Fastest<Operateinfo>().BulkCopy(list);
  24. }
  25. #endregion
  26. //统计当前年份
  27. {
  28. Console.WriteLine("统计当前年份");
  29. var queryableLeft = db.Reportable(ReportableDateType.MonthsInLast1years).ToQueryable<DateTime>();
  30. var queryableRight = db.Queryable<Operateinfo>();
  31. var resultlistx = db.Queryable(queryableLeft).ToList();
  32. var resultlist = db.Queryable(queryableLeft, queryableRight, JoinType.Left, (x1, x2) => x2.Operate_time.ToString("yyyy-MM") == x1.ColumnName.ToString("yyyy-MM"))
  33. .GroupBy((x1, x2) => x1.ColumnName)
  34. .Select((x1, x2) => new
  35. {
  36. count = SqlFunc.AggregateSum(SqlFunc.IIF(x2.Id > 0, 1, 0)), //null的数据要为0所以不能用count
  37. date = x1.ColumnName.ToString("yyyy-MM")
  38. }).ToList()
  39. .OrderBy(c => c.date)
  40. .ToList();
  41. var queryableLeft1 = resultlist.Sum(c => c.count);
  42. int lastYearcoutn = db.Queryable<Operateinfo>().Count(c => c.Operate_time.Year == 2022);
  43. }
  44. {
  45. //统计最近三年
  46. Console.WriteLine("统计最近三年");
  47. var queryableLeft = db.Reportable(ReportableDateType.MonthsInLast3years).ToQueryable<DateTime>();
  48. var queryableRight = db.Queryable<Operateinfo>();
  49. var resultlist = db.Queryable(queryableLeft, queryableRight, JoinType.Left, (x1, x2) => x2.Operate_time.ToString("yyyy-MM") == x1.ColumnName.ToString("yyyy-MM"))
  50. .GroupBy((x1, x2) => x1.ColumnName)
  51. .Select((x1, x2) => new
  52. {
  53. count = SqlFunc.AggregateSum(SqlFunc.IIF(x2.Id > 0, 1, 0)), //null的数据要为0所以不能用count
  54. date = x1.ColumnName.ToString("yyyy-MM")
  55. }
  56. ).ToList().OrderBy(c => c.date)
  57. .ToList();
  58. var threeYearCount = resultlist.Sum(c => c.count);
  59. int threeYearCount1 = db.Queryable<Operateinfo>().Count(c => c.Operate_time.Year == 2022 || c.Operate_time.Year == 2021 || c.Operate_time.Year == 2020);
  60. }
  61. {
  62. //统计最近10年;
  63. Console.WriteLine("最近10年");
  64. var queryableLeft = db.Reportable(ReportableDateType.MonthsInLast10years).ToQueryable<DateTime>();
  65. var queryableRight = db.Queryable<Operateinfo>();
  66. var resultlist = db.Queryable(queryableLeft, queryableRight, JoinType.Left, (x1, x2) => x2.Operate_time.ToString("yyyy-MM") == x1.ColumnName.ToString("yyyy-MM"))
  67. .GroupBy((x1, x2) => x1.ColumnName)
  68. .Select((x1, x2) => new
  69. {
  70. count = SqlFunc.AggregateSum(SqlFunc.IIF(x2.Id > 0, 1, 0)), //null的数据要为0所以不能用count
  71. date = x1.ColumnName.ToString("yyyy-MM")
  72. }
  73. ).ToList().OrderBy(c => c.date)
  74. .ToList();
  75. var tenYearCount = resultlist.Sum(c => c.count);
  76. int tenYearCount1 = db.Queryable<Operateinfo>().Count(c => c.Operate_time.Year == 2022
  77. || c.Operate_time.Year == 2021
  78. || c.Operate_time.Year == 2020
  79. || c.Operate_time.Year == 2019
  80. || c.Operate_time.Year == 2018
  81. || c.Operate_time.Year == 2017
  82. || c.Operate_time.Year == 2016
  83. || c.Operate_time.Year == 2015
  84. || c.Operate_time.Year == 2014
  85. || c.Operate_time.Year == 2013);
  86. }
  87. {
  88. //统计今年一月份统计
  89. Console.WriteLine("统计今年一月份统计 ");
  90. var queryableLeft = db.Reportable(ReportableDateType.years1).ToQueryable<DateTime>();
  91. var queryableRight = db.Queryable<Operateinfo>();
  92. var resultlist = db.Queryable(queryableLeft, queryableRight, JoinType.Left, (x1, x2) => x2.Operate_time.ToString("yyyy-MM") == x1.ColumnName.ToString("yyyy-MM"))
  93. .GroupBy((x1, x2) => x1.ColumnName)
  94. .Select((x1, x2) => new
  95. {
  96. count = SqlFunc.AggregateSum(SqlFunc.IIF(x2.Id > 0, 1, 0)), //null的数据要为0所以不能用count
  97. date = x1.ColumnName.ToString("yyyy-MM")
  98. }
  99. ).ToList().OrderBy(c => c.date)
  100. .ToList();
  101. var years1Count1 = resultlist.Sum(c => c.count);
  102. int years1Count2 = db.Queryable<Operateinfo>().Count(c => c.Operate_time.Year == 2022 && c.Operate_time.Month == 1);
  103. }
  104. {
  105. //最近三年一月份统计
  106. Console.WriteLine("最近三年一月份统计 ");
  107. var queryableLeft = db.Reportable(ReportableDateType.years3).ToQueryable<DateTime>();
  108. var queryableRight = db.Queryable<Operateinfo>();
  109. var resultlist = db.Queryable(queryableLeft, queryableRight, JoinType.Left, (x1, x2) => x2.Operate_time.ToString("yyyy-MM") == x1.ColumnName.ToString("yyyy-MM"))
  110. .GroupBy((x1, x2) => x1.ColumnName)
  111. .Select((x1, x2) => new
  112. {
  113. count = SqlFunc.AggregateSum(SqlFunc.IIF(x2.Id > 0, 1, 0)), //null的数据要为0所以不能用count
  114. date = x1.ColumnName.ToString("yyyy-MM")
  115. }
  116. ).ToList().OrderBy(c => c.date)
  117. .ToList();
  118. var years1Count = resultlist.Sum(c => c.count);
  119. int years1Count1 = db.Queryable<Operateinfo>().Count(c => (c.Operate_time.Year == 2022 && c.Operate_time.Month == 1) || (c.Operate_time.Year == 2021 && c.Operate_time.Month == 1)
  120. || (c.Operate_time.Year == 2020 && c.Operate_time.Month == 1));
  121. }
  122. {
  123. //最近10年一月份统计
  124. Console.WriteLine("最近10年一月份统计 ");
  125. var queryableLeft = db.Reportable(ReportableDateType.years10).ToQueryable<DateTime>();
  126. var queryableRight = db.Queryable<Operateinfo>();
  127. var resultlist = db.Queryable(queryableLeft, queryableRight, JoinType.Left, (x1, x2) => x2.Operate_time.ToString("yyyy-MM") == x1.ColumnName.ToString("yyyy-MM"))
  128. .GroupBy((x1, x2) => x1.ColumnName)
  129. .Select((x1, x2) => new
  130. {
  131. count = SqlFunc.AggregateSum(SqlFunc.IIF(x2.Id > 0, 1, 0)), //null的数据要为0所以不能用count
  132. date = x1.ColumnName.ToString("yyyy-MM")
  133. }
  134. ).ToList().OrderBy(c => c.date)
  135. .ToList();
  136. var queryableLeft1 = resultlist.Sum(c => c.count);
  137. int years1Count = db.Queryable<Operateinfo>().Count(c =>
  138. (c.Operate_time.Year == 2022 && c.Operate_time.Month == 1)
  139. || (c.Operate_time.Year == 2021 && c.Operate_time.Month == 1)
  140. || (c.Operate_time.Year == 2020 && c.Operate_time.Month == 1)
  141. || (c.Operate_time.Year == 2019 && c.Operate_time.Month == 1)
  142. || (c.Operate_time.Year == 2018 && c.Operate_time.Month == 1)
  143. || (c.Operate_time.Year == 2017 && c.Operate_time.Month == 1)
  144. || (c.Operate_time.Year == 2016 && c.Operate_time.Month == 1)
  145. || (c.Operate_time.Year == 2015 && c.Operate_time.Month == 1)
  146. || (c.Operate_time.Year == 2014 && c.Operate_time.Month == 1)
  147. || (c.Operate_time.Year == 2013 && c.Operate_time.Month == 1));
  148. }
至此您已成为使用此orm的高级开发   202407160036
                 --无他唯手熟尔!
4、进阶功能
5、集成整合
6、脚手架应用
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/853488
推荐阅读
相关标签
  

闽ICP备14008679号