SqlSugar介绍及应用场景及常用操作

  1. 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介绍

  1. 功能特点
    • 高性能:在大数据量的插入和查询操作中,SqlSugar的性能明显优于其他ORM框架。它优化了SQL生成策略,并在底层对数据库操作进行了精细优化。
    • 高扩展性:支持自定义Lamada函数解析、扩展数据类型、支持自定义实体特性、外部缓存等,满足复杂和定制化的需求。
    • 多数据库支持:全面支持包括MySqlSqlServerSqliteOracle在内的多个数据库,并且对国内常见的国产数据库如达梦、人大金仓等也提供良好支持。
    • 动态SQL生成:根据查询条件自动构建高效的SQL语句,避免手写SQL的麻烦。
    • 代码生成器:内置的代码生成工具可以自动生成基于数据库表的实体类和DAL(数据访问层),节省开发时间。
    • 事务管理:提供简便的事务控制,确保多条操作可以在一个原子性、一致性、隔离性和持久性的事务中执行。
    • 缓存机制:支持二级缓存,可以显著提高应用性能。
    • LINQ查询支持:利用C#LINQ功能,可以写出更符合编程习惯的查询代码。
  2. 优点
    • 简单易用:简洁明了的API设计,学习成本低,易于上手。
    • 功能全面:虽然SqlSugar小巧,但其功能并不逊色于其他ORM框架。
    • 持续更新:框架持续迭代和更新,保持对新技术的支持和兼容。
    • 社区活跃:拥有活跃的开发者社区,问题响应及时,用户支持良好。

应用场景

SqlSugar适用于各种类型的应用场景,包括但不限于:

  1. Web开发:在构建Web应用时,SqlSugar可以帮助开发者快速完成数据库操作,提高开发效率。无论是电商网站中的订单管理、用户行为记录还是报表生成,SqlSugar都能提供强大的支持。
  2. 桌面应用:对于需要频繁与数据库交互的桌面应用,SqlSugar的高性能和低耦合性使得开发更加高效。
  3. 移动服务端:在构建移动应用的服务端时,SqlSugar可以简化数据库操作,使开发者更专注于业务逻辑的实现。
  4. 数据密集型应用:对于需要处理大数据量或进行实时数据分析的应用,SqlSugar的高性能和扩展性能够满足其需求。
  5. 快速原型开发:在快速搭建数据库相关功能时,SqlSugar的代码生成器和动态SQL生成功能可以显著节省开发时间。
  6. 维护现有系统:在已有项目中,如果当前的数据库访问层存在低效或不完善的问题,可以考虑使用SqlSugar进行替换,以提升系统性能和可维护性。

综上所述,SqlSugar凭借其高性能、高扩展性、多数据库支持以及简单易用的特点,在.NET开发领域具有广泛的应用前景。

  1. 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();

}

  1. 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();

 }

  1. 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();

2WinForm中注意

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 收费框架 未进行测试)

  1. SqlSugar操作数据库表返回DataTable
  2.  原生 Sql 操作 ,Sql和存储过程

功能介绍

下面的方法支持复杂的Sql  返回多个结果集 、存储过程等  、可以理解为了一个高级DbHelper

  1. 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"nulltrue);//设置为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;

5in参数用法

 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')

6SqlServerGo的脚本处理

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(表游标)

11Dapper用户转SqlSugar

https://www.cnblogs.com/sunkaixuan/p/18206516

12DataSetList<>

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();

  1. 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 或其他数据访问技术可能会更灵活或更适合你的需求。

  1. 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();

  1. 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 { getset; }//item1和item2不能有重复字段

             

     [SugarColumn(IsOwnsOne = true)]

     public ITEM2 ITEM2 { getset; }//item1和item2不能有重复字段

}

public class ITEM1 

{

     public int ID { getset; }

}

public class ITEM2

{

    public string Name { getset; }

}

效果图

  • 27
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
SQLSugar是一个ORM框架,可以简化对关系型数据库的操作。它提供了对Oracle、SQL Server、MySQLSQLite等多种数据库的支持。下面介绍一下SQLSugar操作Oracle的方法: 1. 引用Oracle.DataAcess.dll 需要在项目中引用Oracle.DataAcess.dll,可以在NuGet上下载。 2. 配置连接字符串 使用SQLSugar连接Oracle数据库时,需要配置连接字符串。可以在Web.config或者App.config中添加以下代码: ``` <connectionStrings> <add name="OracleConnectionString" connectionString="Data Source=ORACLE;User ID=USERNAME;Password=PASSWORD;"/> </connectionStrings> ``` 这里需要替换ORACLE、USERNAME和PASSWORD为实际的值。 3. 配置SqlSugarClient 在使用SqlSugar之前,需要先配置SqlSugarClient。代码如下: ``` using SqlSugar; public class OracleDbContext { public static SqlSugarClient GetInstance() { var db = new SqlSugarClient(new ConnectionConfig() { ConnectionString = ConfigurationManager.ConnectionStrings["OracleConnectionString"].ConnectionString, DbType = DbType.Oracle, IsAutoCloseConnection = true, InitKeyType = InitKeyType.Attribute, ConfigureExternalServices = new ConfigureExternalServices() { EntityService = (property, column) => { if (property.Name.Equals("Id")) return new EntityColumnInfo() { ColumnName = "ID", IsPrimarykey = true }; else return new EntityColumnInfo() { ColumnName = column.DbColumnName }; } } }); return db; } } ``` 4. 使用SqlSugar进行操作 有了SqlSugarClient之后,就可以进行数据库操作了。以下是一些常用操作方法: - 查询所有记录 ``` var list = db.Queryable<Student>().ToList(); ``` - 根据条件查询 ``` var list = db.Queryable<Student>().Where(s => s.Name == "Tom").ToList(); ``` - 分页查询 ``` var list = db.Queryable<Student>().Where(s => s.Age > 20).OrderBy(s => s.Id).ToPageList(2, 10); ``` - 插入记录 ``` var student = new Student() { Name = "Tom", Age = 25 }; db.Insertable(student).ExecuteCommand(); ``` - 更新记录 ``` db.Updateable<Student>().SetColumns(s => new Student() { Age = 26 }).Where(s => s.Name == "Tom").ExecuteCommand(); ``` - 删除记录 ``` db.Deleteable<Student>().Where(s => s.Id == 1).ExecuteCommand(); ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

管理大亨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值