- 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; } } |
效果图