- SqlSugar介绍及应用场景
1. 真正可以实现零SQL的ORM 建表、索引和CRUD全部支持
2. 支持 .NET 百万级大数据写入、更新、分表和拥有几十亿查询统计成熟解决方案
3. 支持 SAAS 完整应用 :跨库查询 、审计、租户分库 、租户分表 和 租户数据隔离
4. 支持低代码+工作流 (动态建类 、动态建表、无实体多库兼容CRUD 、 JSON TO SQL 、自定义XML等)
5. 支持ValueObject、鉴别器、仓储、UnitOfWork、DbContext、AOP
6. 支持 DbFirst、CodeFirst和WebFirst 3种模式开发
7. 简单易用、功能齐全、高性能、轻量级、服务齐全、官网教程文档、有专业技术支持一天18小时服务
8. 完美支持AOT:多种数据库
SqlSugar是一款专为.NET平台设计的轻量级ORM(对象关系映射)框架,由果糖大数据科技团队维护和更新。它提供了一种无缝的桥梁,将业务逻辑与数据库交互连接起来,使得开发者无需编写大量繁琐的SQL语句,即可完成数据的CRUD(创建、读取、更新和删除)操作。以下是对SqlSugar的详细介绍及其应用场景:
SqlSugar介绍
- 功能特点:
- 高性能:在大数据量的插入和查询操作中,SqlSugar的性能明显优于其他ORM框架。它优化了SQL生成策略,并在底层对数据库操作进行了精细优化。
- 高扩展性:支持自定义Lamada函数解析、扩展数据类型、支持自定义实体特性、外部缓存等,满足复杂和定制化的需求。
- 多数据库支持:全面支持包括MySql、SqlServer、Sqlite、Oracle在内的多个数据库,并且对国内常见的国产数据库如达梦、人大金仓等也提供良好支持。
- 动态SQL生成:根据查询条件自动构建高效的SQL语句,避免手写SQL的麻烦。
- 代码生成器:内置的代码生成工具可以自动生成基于数据库表的实体类和DAL(数据访问层),节省开发时间。
- 事务管理:提供简便的事务控制,确保多条操作可以在一个原子性、一致性、隔离性和持久性的事务中执行。
- 缓存机制:支持二级缓存,可以显著提高应用性能。
- LINQ查询支持:利用C#的LINQ功能,可以写出更符合编程习惯的查询代码。
- 优点:
- 简单易用:简洁明了的API设计,学习成本低,易于上手。
- 功能全面:虽然SqlSugar小巧,但其功能并不逊色于其他ORM框架。
- 持续更新:框架持续迭代和更新,保持对新技术的支持和兼容。
- 社区活跃:拥有活跃的开发者社区,问题响应及时,用户支持良好。
应用场景
SqlSugar适用于各种类型的应用场景,包括但不限于:
- Web开发:在构建Web应用时,SqlSugar可以帮助开发者快速完成数据库操作,提高开发效率。无论是电商网站中的订单管理、用户行为记录还是报表生成,SqlSugar都能提供强大的支持。
- 桌面应用:对于需要频繁与数据库交互的桌面应用,SqlSugar的高性能和低耦合性使得开发更加高效。
- 移动服务端:在构建移动应用的服务端时,SqlSugar可以简化数据库操作,使开发者更专注于业务逻辑的实现。
- 数据密集型应用:对于需要处理大数据量或进行实时数据分析的应用,SqlSugar的高性能和扩展性能够满足其需求。
- 快速原型开发:在快速搭建数据库相关功能时,SqlSugar的代码生成器和动态SQL生成功能可以显著节省开发时间。
- 维护现有系统:在已有项目中,如果当前的数据库访问层存在低效或不完善的问题,可以考虑使用SqlSugar进行替换,以提升系统性能和可维护性。
综上所述,SqlSugar凭借其高性能、高扩展性、多数据库支持以及简单易用的特点,在.NET开发领域具有广泛的应用前景。
- SqlSugar连接多个数据库
//---------------------多库操作------------------------------
//主db
var db = new SqlSugarClient(new List<ConnectionConfig>()
{
new ConnectionConfig(){ConfigId="A",DbType=SqlSugar.DbType.SqlServer,ConnectionString="Database=netcoredev;Server=.;Integrated Security=false;User ID=sa;Password=1;",IsAutoCloseConnection=true},
new ConnectionConfig(){ConfigId="B",DbType=SqlSugar.DbType.SqlServer,ConnectionString="Database=netcoredevtest1;Server=.;Integrated Security=false;User ID=sa;Password=1;",IsAutoCloseConnection=true },
new ConnectionConfig(){ConfigId="C",DbType=SqlSugar.DbType.SqlServer,ConnectionString="Database=netcoredevtest2;Server=.;Integrated Security=false;User ID=sa;Password=1;",IsAutoCloseConnection=true }
});
//获取子Db
var childA = db.GetConnection("A");
var childB = db.GetConnection("B");
var childC = db.GetConnectionScope("C");//线程安全
//使用子Db用
var lsA = childA.Queryable<Sys_Log>().ToList();
var lsB = childB.Queryable<Sys_Log>().ToList();
var lsC = childC.Queryable<Sys_Log>().ToList();
//-----------------------------多库事务----------------------------
childA.CodeFirst.InitTables<Order>();
childB.CodeFirst.InitTables<Order>();
childC.CodeFirst.InitTables<Order>();
// 开启事务
try
{
db.BeginTran(); //不能是db.Ado.BeginTran
db.GetConnection("A").Insertable(new Order()
{
Id = 1,
CreateTime = DateTime.Now,
CustomId = 1,
Name = "a",
Price = 1
}).ExecuteCommand();
db.GetConnection("B").Insertable(new Order()
{
Id = 2,
CreateTime = DateTime.Now,
CustomId = 1,
Name = "a",
Price = 1
}).ExecuteCommand();
db.GetConnection("C").Insertable(new Order()
{
Id = 55,
CreateTime = DateTime.Now,
CustomId = 1,
Name = "a",
Price = 1
}).ExecuteCommand();
//提交事务
db.CommitTran(); //不能是db.ado.CommitTran
}
catch (Exception ex)
{
//回滚事务
db.RollbackTran();
}
- SqlSugar连接单个数据库实现增删改查
public static void opCURD()
{
//创建数据库对象 (用法和EF Dappper一样通过new保证线程安全)
SqlSugarClient Db = new SqlSugarClient(new ConnectionConfig()
{
ConnectionString = "Data Source=.;Initial Catalog=netcoredev;Persist Security Info=True;User ID=sa;Password=1;Connect Timeout=500;",
DbType = DbType.SqlServer,
IsAutoCloseConnection = true
},
db =>
{
db.Aop.OnLogExecuting = (sql, pars) =>
{
//获取原生SQL推荐 5.1.4.63 性能OK
Console.WriteLine(UtilMethods.GetNativeSql(sql, pars));
//获取无参数化SQL 对性能有影响,特别大的SQL参数多的,调试使用
//Console.WriteLine(UtilMethods.GetSqlString(DbType.SqlServer,sql,pars))
};
//注意多租户 有几个设置几个
//db.GetConnection(i).Aop
});
//建库
Db.DbMaintenance.CreateDatabase();//达梦和Oracle不支持建库
//建表(看文档迁移)
Db.CodeFirst.InitTables<Student>(); //所有库都支持
//查询表的所有
var list = Db.Queryable<Student>().ToList();
//插入
Db.Insertable(new Student() { SchoolId = 1, Name = "jack" }).ExecuteCommand();
//更新
Db.Updateable(new Student() { Id = 1, SchoolId = 2, Name = "jack2" }).ExecuteCommand();
//删除
Db.Deleteable<Student>().Where(it => it.Id == 1).ExecuteCommand();
Console.WriteLine("恭喜你已经入门了,后面只需要用到什么查文档就可以了。");
Console.ReadKey();
}
- SqlSugar批量操作
海量数据操作ORM性能瓶颈在实体转换上面,并且不能使用常规的Sql去实现
当列越多转换越慢,SqlSugar将转换性能做到极致,并且采用数据库最佳API
操作数据库达到极限性能
1.1 BulkCopy
大数据插入
db.Fastest<Order>().BulkCopy(lstData); // 插入 db.Fastest<Order>().PageSize(100000).BulkCopy(insertObjs); db.Fastest<System.Data.DataTable>().AS( "order" ).BulkCopy(dataTable); // 使用Winfom需要看标题2 |
1.2 BulkUpdate
大数据更新
db.Fastest<Order>().BulkUpdate(GetList()) // 更新 db.Fastest<Order>().PageSize(100000).BulkUpdate(GetList()) // 更新 db.Fastest<Order>().BulkUpdate(GetList(), new string [] { "Id" }); // 无主键 db.Fastest<Order>().BulkUpdate(GetList(), new string []{ "id" }, new string []{ "name" , "time" }) // 只更新几列 //DataTable db.Fastest<System.Data.DataTable>().AS( "Order" ).BulkUpdate(dataTable, new string [] { "Id" }); //Id 是主键 db.Fastest<System.Data.DataTable>().AS( "Order" ).BulkUpdate(dataTable, new string [] { "Id" }, 更新的列); // 使用Winfom需要看标题2 |
1.3 BulkMerge (5.1.4.109)
大数据 : 插入或者更新
// 原理 //Oracle 和SqlServer使用了Merge Into+BulkCopy // 其他库底层是 db.Storageable(list).ExecuteSqlBulkCopy() db.Fastest<Order>().BulkMerge(List); db.Fastest<Order>().PageSize(100000).BulkMerge(List); //DataTable 升级到:SqlSugarCore 5.1.4.147-preview15+ db.Fastest<System.Data.DataTable>() .AS( "Order" ) // 表名 // 第一个参数datatable // 第二个参数主键 // 第三个参数是不是自增 true为自增 .BulkMerge(dt, new string [] { "Id" }, true ); |
1.4 BulkQuery
普通查询就行了性能超快
db.Queryable<Order>().ToList(); // 比Dapper略快 // 分页降低内存 适合复杂的DTO转换和导出 List<Order> order = new List<Order>(); db.Queryable<Order>().ForEach(it=> { order.Add(it); /* 禁止这儿操作数据库因为会循环*/ } ,2000); |
1.5 BulkDelete
直接用分页删除就行了
db.Deleteable<Order>(list).PageSize(1000).ExecuteCommand(); |
2、WinForm中注意
winform中推荐用异步事件 async await
如果用同步方法要加Task.Run 不然会卡死UI
// 方式1:使用异步方法 private async void MyButton_Click( object sender, EventArgs e) { // async await 不能少 var result =await db.Fastest<Order>().BulkCopyAsync(lstData) // 使用result... } // 使用同步方法要加Task.Run Task.Run(()=>{ var db=Db.CopyNew(); db.Fastest<DC_Scene>().BulkCopy(lstData); }); |
3、产品对比
插入的列越多,越能体现性能
Db.Fastest.BulkCopy 比 EFCore.Bulkextension 快30% 插入的列的数量越多越强
Db.Fastest.BulkUpdate 是 EFCore.Bulkextension 2-3倍
SqlSugar>EFCore.Bulkextension>Dapper (ef plus & dapper plus 收费框架 未进行测试)
- SqlSugar操作数据库表返回DataTable
- 原生 Sql 操作 ,Sql和存储过程
功能介绍
下面的方法支持复杂的Sql 、 返回多个结果集 、存储过程等 、可以理解为了一个高级DbHelper
- 1、用法介绍
// 调用Sql db.Ado. 具体方法 // 调用存储过程 db.Ado.UseStoredProcedure(). 具体方法 |
2、方法列表
方法名 | 描述 | 返回值 |
SqlQuery< T > | 查询所有返回实体集合 | List |
SqlQuery<T,T2> | 可以返回2个结果集 | Tuple<List, List> SQLITE(驱动)需要查询前面加上 this.Context.Ado.IsClearParameters=false; |
SqlQuerySingle | 查询第一条记录 | T |
SqlQuery<dynamic> | 查查询所有返回匿名对象 | dynamic |
GetDataTable | 查询所有 | DataTable |
GetDataReader | 读取DR需要手动释放DR | DataReader |
GetDataSetAll | 获取多个结果集 | DataSet |
ExecuteCommand | 返回受影响行数,一般用于增删改 | int |
GetScalar | 获取首行首列 | object |
GetString | 获取首行首列 | string |
GetInt | 获取首行首列 | int |
GetLong | 获取首行首列 | long |
GetDouble | 获取首行首列 | Double |
GetDecimal | 获取首行首列 | Decimal |
GetDateTime | 获取首行首列 | DateTime |
t3、使用案例
技巧:Sql中的关键词用@可以支持多库
// 无参数 var dt=db.Ado.GetDataTable(sql) // 上面列表中 SqlQuery 等方法都可以不一定是GetDataTable // 参数1:简化用法 var dt=db.Ado.GetDataTable( "select * from table where id=@id and name like @name" , new {id=1,name= "%" +jack+ "%" }); // 参数2:复杂用法 var dt=db.Ado.GetDataTable( "select * from table where id=@id and name like @name" , new List<SugarParameter>(){ new SugarParameter( "@id" ,1), new SugarParameter( "@name" , "%" +jack+ "%" ) // 执行sql语句 }); // 参数3:结合用法 var pars =db.Ado.GetParameters( new {p=1,p2=p}); pars[1].DbType=System.Data.DbType.Date; var dt=db.Ado.GetDataTable(sql,pars) // 原生SQL用实体 sql 查询 List<ClassA> t=db.Ado.SqlQuery<ClassA>(sql); // 比db.SqlQueryable兼容性更强,支持复杂SQL存储过程,缺点没有自带的分页操作 // 原生SQL用匿名对象 sql 查询 List<dynamic> t=db.Ado.SqlQuery<dynamic>(sql); // 插入 更新操作一般用 db.Ado.ExecuteCommand(sql); //db.Ado.xxx 还有更多方法看文档最下面 |
Sql 查询用
GetDataTable
SqlQuery
Sql 增删改用
增删 改可以用 ExecuteCommand
4、 调用存储过程
// 简单用法 var dt = db.Ado.UseStoredProcedure().GetDataTable( "sp_school" , new {name= " 张三" ,age=0}); // 带有output的存储过程 var nameP= new SugarParameter( "@name" , " 张三" ); var ageP= new SugarParameter( "@age" , null , true ); // 设置为output var dt = db.Ado.UseStoredProcedure().GetDataTable( "sp_school" ,nameP,ageP); // 返回dt var list = db.Ado.UseStoredProcedure().SqlQuery<Class1>( "sp_school" ,nameP,ageP); // 返回List // 更多返回方法 看文档最下面 //ageP.Value 可以拿到output值 //SqlSever Datatable 参数 看文档 SqlServer 中有介绍 //Oracle 游标参数用法 Blob类型 Clob类型 看文档 Oracle中有介绍 // 如果是ReturnValue var nameP= new SugarParameter( "@name" , " 张三" , typeof ( string ),ParameterDirection.ReturnValue); // 我们还可以用 GetParameters 来简化参数操作 SugarParameter [] pars =db.Ado.GetParameters( new {p=1,p2=p}); pars[1].Direction=ParameterDirection.Output; |
5、in参数用法
var dt = db.Ado.SqlQuery<Order>( "select * from [order] where id in(@ids)" , new { ids = new int [] { 1,2,3 } }); // 是个数组不是字符串 // new SugarParamter("@ids",int[] { 1,2,3}) //select * from [order] where id in('1','2','3') |
6、SqlServer带Go的脚本处理
db.Ado.ExecuteCommandWithGo(sql) //go 语句是独立一行就支持 |
7、查询2个结果集
等同于Dapper中的 querymultiple
var views=db.SqlQuery<T,T2>( "select * from t; select * from t2" ); // 多实体 var t1list=views.Item1; var t2list=views.Item2; |
8、集合参数批量操作
和Dapper中的2层集合的参数功能是一样的,SqlSugar中不用写SQL用法如下
// 删除 List<Dictionary< string , object >> list= new List<Dictionary< string , object >>; list.Add( 字典); // 只需要条件列 db.Deleteable< object >().AS( "[Order]" ).WhereColumns(list).ExecuteCommand(); // 插入 List<Dictionary< string , object >> list= new List<Dictionary< string , object >>; list.Add( 字典) // 插入所有要的所有列 db.Insertable(list).AS( "student" ).ExecuteCommand(); // 更新 List<Dictionary< string , object >> list= new List<Dictionary< string , object >>; list.Add( 字典) // 更新和条件所需要的所有列 var t66 = db.Updateable(list).AS( "student" ).WhereColumns( "id" ).ExecuteCommand(); |
特殊SQL批量
//5.0.6.3 using (db.Ado.OpenAlways()) { // 开启长连接 foreach ( var pars in List<parameter[]>) { db.Ado.ExecuteCommand(sql,paras); } } |
10、表值参数、游标参数
文档搜索你用的具体数据库 : SqlServer (表值)
文档搜索你用的具体数据库 : Oracle(表游标)
11、Dapper用户转SqlSugar
https://www.cnblogs.com/sunkaixuan/p/18206516
12、DataSet转List<类>
SqlQuery<T,T2,T3..>最多只能有7个,我们可以用db.Ado.GetDataSetAll拿出超过7个结果集
var datables=ds.Tables.Cast<DataTable>().ToList(); foreach ( var item in tables) { var list = db.Utilities.DataTableToList<Order>(item); } |
13、类作为参数
默认只支持匿名类作为参数,普通类参数是不支持的
如果想支持类作为参数可以自个封装个方法
代码如下:
var pars= new {id=1;name= "a" }; // 默认支持匿名类 // 普通类作为参数最大问题 会把所有属性都变成参数 ,匿名类型就不存在这个问题 var obj = new Order(){ ....} ; // 类对象 SugarParameter[] pars=obj.GetType().GetProperties() .Select(it => new SugarParameter(it.Name, it.GetValue(obj))).ToArray(); |
- SqlSugar操作数据库表返回DataSet
SqlSugar 是一个简单而强大的 .NET ORM(对象关系映射)库,它专注于让开发者以更少的代码和更直观的方式来操作数据库。然而,SqlSugar 本身并不直接支持返回 DataSet 类型的数据。DataSet 是 ADO.NET 中的一个关键组件,用于在内存中缓存数据表及其关系。
尽管 SqlSugar 主要用于返回强类型化的数据集合(如 List<T>),但你可以通过结合使用 SqlSugar 的 Ado 功能与 ADO.NET 来实现返回 DataSet 的目的。Ado 功能允许你执行原始的 SQL 命令,并接收各种类型的数据,包括 DataSet。
以下是一个示例,展示了如何使用 SqlSugar 的 Ado 功能来执行 SQL 查询并返回一个 DataSet:
csharp复制代码
| using SqlSugar; |
| using System; |
| using System.Data; |
| |
| class Program |
| { |
| static void Main(string[] args) |
| { |
| // 假设你已经有一个 SqlSugarClient 实例 |
| SqlSugarClient db = new SqlSugarClient(new ConnectionConfig() |
| { |
| ConnectionString = "你的数据库连接字符串", |
| DbType = DbType.SqlServer, // 根据你的数据库类型进行设置 |
| IsAutoCloseConnection = true, |
| InitKeyType = InitKeyType.Attribute |
| }); |
| |
| // 使用 Ado 执行 SQL 查询并获取 DataSet |
| string sql = "SELECT * FROM YourTableName"; // 替换为你的 SQL 查询 |
| var parameters = new SqlSugarParameter[] { }; // 如果有参数,则在这里添加 |
| |
| DataSet dataSet = db.Ado.GetDataSet(sql, parameters); |
| |
| // 现在你可以像使用 ADO.NET 一样处理 DataSet 了 |
| if (dataSet != null && dataSet.Tables.Count > 0) |
| { |
| DataTable table = dataSet.Tables[0]; |
| foreach (DataRow row in table.Rows) |
| { |
| // 假设表中有名为 ColumnName 的列 |
| Console.WriteLine(row["ColumnName"].ToString()); |
| } |
| } |
| } |
| } |
请注意,上面的代码示例中,你需要将 "你的数据库连接字符串" 替换为你的实际数据库连接字符串,将 "YourTableName" 替换为你想要查询的数据库表名,并根据需要调整 SQL 查询和参数。
此外,尽管 SqlSugar 提供了丰富的功能来简化数据库操作,但在某些情况下,直接使用 ADO.NET 或其他数据访问技术可能会更灵活或更适合你的需求。
- SqlSugar基本查询查询
查所有
List<Student> list=db.Queryable<Student>().ToList() //select * from Student |
查询总数
int count=db.Queryable<Student>().Count() //select count(1) from Student |
按条件查询
db.Queryable<Student>().Where(it=>it.Id==1).ToList() //select * from Student where id=1 db.Queryable<Student>().Where(it=>it.name != null ).ToList() // 不是null //select * from Student where name is not null db.Queryable<Student>().Where(it=>it.name == null ).ToList() // 是null //select * from Student where name is null db.Queryable<Student>().Where(it=>it.name != "" ).ToList() // 不是空 ,不为空 //select * from Student where name <> '' |
多条件查询
db.Queryable<Student>().Where(it=>it.Id>10&&it.Name== "a" ).ToList() //select * from Student where id>10 and name='a' db.Queryable<Student>().Where(it=>it.Id>10).Where(it=>it.Name== "a" ).ToList() //select * from Student where id>10 and name='a' // 如果是或者关系可以用 || |
动态OR查询
var exp= Expressionable.Create<Student>(); exp.OrIF( 条件,it=>it.Id==1); //.OrIf 是条件成立才会拼接OR exp.Or(it =>it.Name.Contains( "jack" )); // 拼接OR var list=db.Queryable<Student>().Where(exp.ToExpression()).ToList(); |
模糊查询
db.Queryable<Student>().Where(it =>it.Name.Contains( "jack" )).ToList(); //select * from Student where name like %jack% |
根据主键查询
susgar中的single等同于EF中的SingleOrDefault
/* 单主键查询*/ db.Queryable<Student>().InSingle(2) // 通过主键查询 SingleById db.Queryable<Student>().Single(it=>it.Id==2) // 根据ID查询 //select * from Student where id=2 /* 多主键查询*/ var getAll=db.Queryable<Order>().WhereClassByPrimaryKey( new Order(){Pk1=1,Pk2=xx}).ToList(); // 单个实体 vargetAll=db.Queryable<Order>().WhereClassByPrimaryKey(List<Order>).ToList(); // 支持集合 |
查询第一条 ,第一行
.First() 等同于C#中的 FirstOrDefault , 没有值返回 null
db.Queryable<Student>().First(it=>it.Id==1) // 没有返回Null //select top 1 * from Student where id=1 |
查询最后一条
First() 等同于C#中的 FirstOrDefault , 没有值返回 null
db.Queryable<Student>() .OrderBy(it=>it.Id,OrderByType.Desc ) // 倒序 .First(it=>it.Id>10) // 没有返回Null //select top 1 * from Student order by id desc where id>10 |
查前几条
db.Queryable<Student>().Take(10).ToList() //select top 10 * from Student |
数据行数
db.Queryable<Student>().Where(it=>it.Id>11).Count() // 同步 db.Queryable<Student>().Where(it=>it.Id>11).CountAsync() // 异步 //select count(*) from Student where id>11 // 你也可以用函数 SqlFunc.AggregateCount |
设置新表名
// 例1:更新表名 db.Queryable<School>().AS( "Student" ).ToList(); // 生成的SQL SELECT [ID],[NAME] FROM Student // 动态表名 表别名 指定表明 // 例2:给表名添加前缀 db.Queryable<School>().AS( "dbo.School" ).ToList(); // 生成的SQL SELECT [ID],[NAME] FROM dbo.School // 如果不用AS也可以在特性中设置别名,看文档:实体本置 |
是否存在记录
is exists
db.Queryable<Student>().Where(it=>it.Id>11).Any() db.Queryable<Student>().Any(it=>it.Id>11) // 上面语法的简化 // 异步就是 AnyAsync() |
In查询(单个字段)
单个字段
int [] allIds = new int []{2,3,31}; db.Queryable<OrderItem>().Where(it => allIds.Contains(it.OrderId)).ToList() //orderid in (2,3,31) // 支持超过 1000以上,只要数据库不慢没有上限 // 字符串类型 varchar和nvarchar (默认varchar来保证性能) NameList.Contains(it.Name, true ) //true 和false来控制是varchar还是nvarchar |
In查询(多个字段)
多个字段 (升级:5.1.4.67-preview04)
List<OrderItem> list=xxx; db.Queryable<OrderItem>().Where(it => list.Any(s => s.Id == it.Id && s.Name == it.Name)) // 也可以用动态表达式拼OR实现 |
In模糊查询
对象集合In like 升级:5.1.4.67
List<OrderItem> list=xxx; db.Queryable<OrderItem>().Where(it => list.Any(s => it.Name.Contanins(s.Name))) // 也可以用动态表达式拼OR实现 |
数组集全 in like :5.1.4.85
List< string > list=xxx; db.Queryable<OrderItem>().Where(it => list.Any(s => it.Name.Contanins(s))) // 也可以用动态表达式拼OR实现 |
Not In
int [] allIds = new int []{2,3,31}; db.Queryable<OrderItem>().Where(it => !allIds.Contains(it.OrderId)).ToList() //orderid NOT in (2,3,31) |
简单排序
db.Queryable<Student>().OrderBy((st,sc)=>sc.Id,OrderByType.Desc).ToList() // 排序 可以多个 // 更多用法 https: //www.donet5.com/Home/Doc?typeId=2312 |
查询一列
db.Queryable<Student>().Select(it=>it.Name).ToList() // 单值 查询列 查询单独列 |
查询单条
查询一条
db.Queryable<Student>().Single(it=>it.Id==1) // 没有返回Null,如果结果大于1条会抛出错误 //select * from Student where id=1 // 查询id等于1的单条记录 |
获取最大值
db.Queryable<Order>().Max(it=>it.Id); // 同步 db.Queryable<Order>().MaxAsync(it=>it.Id); // 异步 // 也可以用函数 SqlFunc.AggregateMax |
获取最小值
db.Queryable<Order>().Min(it=>it.Id); // 同步 db.Queryable<Order>().MinAsync(it=>it.Id); // 异步 // 也可以用函数 SqlFunc.AggregateMin |
求和
db.Queryable<Order>().Sum(it=>it.Id); // 同步 db.Queryable<Order>().SumAsync(it=>it.Id); // 异步 // 也可以用函数 SqlFunc.AggregateSum |
平均值
db.Queryable<Order>().Avg(it=>it.Id); // 同步 db.Queryable<Order>().AvgAsync(it=>it.Id); // 异步 // 也可以用函数 SqlFunc.AggregateAvg |
查询过滤排除某一个字段
生成的sql Select 不会有Files
/*** 单表***/ db.Queryable<Order>().IgnoreColumns(it=>it.Files).ToList(); // 只支持单表查询 /*** 联查***/ // 是主表 var leftQuery=db.Queryable<Order>().IgnoreColumns(it=>it.Files); var list=db.Queryable(leftQuery).LeftJoin<OrderDetails>((o,d)=>o.id==d.orderid).Select(o=>o).ToList(); // 是Join的表 var rightQuery= db.Queryable<OrderItem>().IgnoreColumns(it=>it.Files); var list=db.Queryable<Order>().LeftJoin(rightQuery,(o,d)=>o.Id == d.OrderId).Select(o=>o).ToList(); |
- SqlSugar分页查询
功能注意
db.SqlQueryable只支持简单查询的Sql不能是存储过程和一些特殊逻的Sql,复杂特殊SQL请看文档 【原生Sql】
1、查询分页
注意: order by写外面
int total=0; var list = db.SqlQueryable<Student>( "select * from student" ) .Where(it=>it.Id==1) // 可以表达式 .OrderBy( "id asc" ) // 也可以SQL .ToPageList(1, 2, ref total); // 使用in var list2= db.SqlQueryable<Student>( "select * from student where id in (@ids) " ).AddParameters( new SugarParameter[] { new SugarParameter( "@ids" , new int [] { 1, 2 }) }) .OrderBy( "id asc" ) .ToPageList(1,2); // 当我们不需要分页等操作时,请使用db.Ado.SqlQuery,这个功能支持的更全面 var list = db. Ado.SqlQuery<Student>( " 复杂Sql或者存储过程" ); |
2、结合表达式
var list= db.SqlQueryable<Student>( "select * from student" ).Where(it=>it.Id==1).ToPageList(1, 2); |
3、更多用法
var list= db.SqlQueryable<Student>( "select * from student" ).Where( "id=@id" , new { id=1}).ToPageList(1, 2); // 如果多个参数 new { id=1 , name="xx"} 用逗号隔开 |
4、添加参数
var list = db.SqlQueryable<Student>( "select * from student where id=@id" ).AddParameters( new { id=1}).ToPageList(1, 2, ref total); // 如果多个参数 new { id=1 , name="xx"} 用逗号隔开 |
AddParameters 有很多重载
ISugarQueryable<T> AddParameters(object parameters);
ISugarQueryable<T> AddParameters(SugarParameter[] parameters);
ISugarQueryable<T> AddParameters(List<SugarParameter> parameters);
5、无实体操作
var list= db.SqlQueryable< object >( "select * from student" ).Where( "id=@id" , new {id=1 }).ToDataTablePage(1, 2); |
6、参数IN用法
var list= db.SqlQueryable< object >( "select * from [order] where id in(@ids)" ) .AddParameters( new {ids= new int [] { 1,2,3}} ) // 这儿id需要一个数组 .ToList() |
5、联表多对象映射
和Dapper中的Query<T,T2>效果一样,可以一维对象变成2维护的
var list=db.SqlQueryable<SQLVO>( "select 1 as id,'jack' as name " ).ToList(); public class SQLVO { [SugarColumn(IsOwnsOne = true )] public ITEM1 ITEM1 { get ; set ; } //item1 和item2不能有重复字段 [SugarColumn(IsOwnsOne = true )] public ITEM2 ITEM2 { get ; set ; } //item1 和item2不能有重复字段 } public class ITEM1 { public int ID { get ; set ; } } public class ITEM2 { public string Name { get ; set ; } } |
效果图