应用笔记 · 2023年3月11日

SqlSugar的无实体(匿名)插入、更新、删除、查询以及多库和跨库查询

无实体插入

字典插入(支持多库)

//可以是 Dictionary 或者 List<Dictionary >
var dc= new Dictionary<stringobject>();
dc.Add("name""1");
dc.Add("CreateTime", DateTime.Now);
db.Insertable(dc).AS("student").ExecuteCommand();

匿名对象插入(支持多库)

db.InsertableByDynamic(new   { name="",price=1 })
.AS("OrderInfo")
.ExecuteCommand();

BulkCopy

db.Fastest<System.Data.DataTable>().AS("order").BulkCopy(dataTable);
//具体用法 要看文档  https://www.donet5.com/Home/Doc?typeId=2404

无实体更新

字典更新 (支持多库)

//字典
var dt = new Dictionary<stringobject>();
dt.Add("id", 1);
dt.Add("name""jack");
dt.Add("createTime", DateTime.Now);
var t66 = db.Updateable(dt).AS("student").WhereColumns("id").ExecuteCommand();
//字典集合
var dtList = new List<Dictionary<stringobject>>();
dtList.Add(dt);
dtList.Add(dt2);
var t666 = db.Updateable(dtList).AS("student").WhereColumns("id").ExecuteCommand();

匿名对象更新(支持多库)

db.InsertableByDynamic
(new { id = 1, name = "a" })
.AS("order")
.WhereColumns("id").ExecuteCommand();
//sql 
UPDATE [order]  SET
[name]=@name  WHERE [id]=@id
@id:1,@name:a

SQL方式更新

where条件太灵活可能会有不同数据库不兼容情况

db.Updateable<object>()
.AS("Order")
.SetColumns("name", 1)
.Where("id=1").ExecuteCommand();

BulkCopy更新 (需要较新版本)

根据ID为条件更新

db.Fastest<DataTable>().AS("Order").BulkUpdate(datatable, new string[] { "id" });

无实体删除

字典删除(支持多库)

//根据字典集合删除 
List<Dictionary<string,object>> list= new List<Dictionary<string,object>>;
list.Add(字典);
db.Deleteable<object>().AS("OrderInfo").WhereColumns(list).ExecuteCommand();

拼SQL删除 (不支持多库)

如果存在一些特殊语法不能做到多库兼容

db.Deleteable<object>().AS("OrderInfo").Where("id=@id",new { id=1}).ExecuteCommand();
db.Deleteable<object>().AS("OrderInfo").Where("id in (@id) ",new { id=new int[]{1,2,3}}).ExecuteCommand();//批量

无实体查询

单表查询

//动态表名 ,动态条件 
var list = db.Queryable<dynamic>().AS("order ").Where("id=@id"new { id = 1 }).ToList();//没实体一样用
//表名实体 ,动态条件
var list = db.Queryable<Order>().Where("id=@id"new { id = 1 }).ToList();//没实体一样用
 //除了ToList还支持ToDateTable()

多表查询

var list2 = db.Queryable<dynamic>("o").AS("order")
                        .AddJoinInfo("OrderDetail""i""o.id=i.OrderId")
                        .Where("id=@id"new { id = 1 })
                        .Select("o.*").ToList();
 //除了ToList还支持ToDateTable()

实体加Sql结合的查询

var list = db.Queryable<Order>().Where("id=@id"new { id = 1 }).ToList();

无实体查询(支持多库)

预览版本功能

提前体验可以升级到 5.0.9.2-Preview01版本及以上

 

什么是低代码操作库?

答:用来兼容多种数据库的弱类型操作数据库语法

使用技巧

可以在这个基础上,封装到XML等配置 ( 自定义XML格式 )

1、所有API(支持多库)

//聚合过滤
ISugarQueryable<T> Having(IFuncModel model);
//排序
ISugarQueryable<T> OrderBy(List<OrderByModel> models);
//分组
ISugarQueryable<T> GroupBy(List<GroupByModel> models);
//查询列
ISugarQueryable<T> Select(List<SelectModel> models);
//表名
ISugarQueryable<T> AS(string tableName);
//表名+别名
ISugarQueryable<T> AS(string tableName, string shortName);
//联表查询
ISugarQueryable<T> AddJoinInfo(string tableName, string shortName, 
IFuncModel models, JoinType type = JoinType.Left);
//查询条件
ISugarQueryable<T> Where(List<IConditionalModel> conditionalModels);
//查询条件外面包一层 
ISugarQueryable<T> Where(List<IConditionalModel> conditionalModels,bool isWrap);

2、联表查询

//方式1:函数实现
var list=db.Queryable<object>()
                .AS("order""o")
                .AddJoinInfo("orderdetail""d"new ObjectFuncModel()
                {
                    FuncName = "Equals",
                    Parameters = new List<object>{
                            "d.orderid","o.id"
                    }
                }, JoinType.Left)
                .Select(new List<SelectModel>() {
                    new SelectModel()
                    {
                        AsName = "id",
                        FiledName = "o.id"
                        
        })
        .ToList();
 
 //生成Sql如下                   
 //SELECT o.id AS id FROM Order o Left JOIN orderdetail d ON (d.orderid = o.id)
 
 
//方式2:多个条件
  var onList = new ObjectFuncModel()
          {
            FuncName = "SqlFunc_Format",
            Parameters = new List<object>{
                "d.orderid",">","o.id","&&","o.id",">","{int}:1"
           } };
 var x = db.Queryable<object>()
                .AS("order""o")
                .AddJoinInfo("orderdetail""d", onList, JoinType.Left)
                 .Select(selectItems)
                .ToList();
//SELECT o.id AS id FROM order o 
//Left JOIN orderdetail d ON d.orderid > o.id And o.id > @p0
//方式3:简单拼SQL (这种不能兼容多库说白了就是写SQL)
 AddJoinInfo("table1""a""a.id=o.id and a.id>1", JoinType.Left);

3、Order By

//方式1 多库兼容
var orderList = new List<OrderByModel>{
                     new OrderByModel(){
                         FieldName="id",
                          OrderByType=OrderByType.Desc},
                     new OrderByModel(){
                         FieldName="name",
                            OrderByType=OrderByType.Asc }
                              };
    
var list=db.Queryable<object>().AS("order").OrderBy(orderList).ToList();
//SELECT * FROM Order ORDER BY  id DESC , name ASC
//方式2 直接写SQL,不在乎多库兼容可以用
var list=db.Queryable<object>().AS("order").OrderBy("id desc,name asc").ToList();

4、Group By

//方式1:多库兼容
var groupList=new List<GroupByModel> {
        new GroupByModel(){
        FieldName="id"
        } }; //Sql: id
var having=new ObjectFuncModel() { //嵌套函数的实现
            FuncName= "GreaterThan",
            Parameters= new List<object> {
                new ObjectFuncModel(){ 
                FuncName="AggregateAvg",
                Parameters=new List<object>(){ 
                "ID"
                }
                },"{int}:1"
            }
            }  //Sql: (AVG(ID) > @p0)   
            
                
var list=db.Queryable<object>().AS("order").GroupBy(groupList)
            .Having(having)
            .Select("ID").ToList()
//SELECT ID FROM Order GROUP BY  id  HAVING (AVG(ID) > @p0)
//方式2: 直接写SQL
var list=db.Queryable<object>().AS("order").GroupBy("id")
            .Having("avg(id)>@p")
            .AddParameters(new {p=1})
            .Select("ID").ToList()

5、Select用法

//方式1:多库兼容
var selector= new List<SelectModel>() {
    new SelectModel(){AsName = "id1",FiledName = "id"},
    new SelectModel(){ FiledName = "id"}};
    
var list=db.Queryable<object>().AS("order").Select(selector).ToList();
//SELECT id AS id1 , id AS id FROM Order
//方式2:直接写SQL
var list=db.Queryable<object>().AS("order").Select("ID AS id1,id as id").ToList();

6、函数

支持的函数大致上和SqlFunc.xxx 相同

new ObjectFuncModel() { //嵌套函数的实现
            FuncName= "GreaterThan",
            Parameters= new List<object> {
                new ObjectFuncModel(){ 
                FuncName="AggregateAvg",
                Parameters=new List<object>(){ 
                "ID"
                }
                },"{int}:1"
            }
            }            
//Sql: (AVG(ID) > @p0)
//可以使用的地方
// 带IFuncModel重载的方法, 比如 Having(IFuncModel model) 和 AddJoinInfo(+4重载)
// 带有SelectModel重载方法 new SelectModel(){ FiledName=FuncModel}
// 带有OrderByModel重载方法 new OrderByModel(){ FiledName=FuncModel}

7、Where

7.1 Where构造模式

支持多库 ,也方便构造或者前端序列化 ,手写硬编码逻辑比较吃力,代码量多,适合封装使用

//手动构造
var conModels = new List<IConditionalModel>();
conModels.Add(new ConditionalModel{ FieldName = "id",ConditionalType=ConditionalType.Equal,FieldValue="1"});
conModels.Add(new ConditionalModel{ FieldName = "name",ConditionalType=ConditionalType.Equal,FieldValue="jack"});  
//可以设置类型 CSharpTypeName="int"
 
 var student = db.Queryable<Student>().Where(conModels).ToList();
//select * from Student where id=1 and name = 'jack'
//详细用法:https://www.donet5.com/Home/Doc?typeId=2314

7.2 Where拼接模式

用起来灵活也支持多库,不方便封装,适合手写

  var whereFunc = new ObjectFuncModel()
  {
            FuncName = "SqlFunc_Format",
            Parameters = new List<object>{
            "id",">","{int}:1","&&","name","=","{string}:a"
    }
   };
  db.Queryable<object>().AS("Order").Where(whereFunc).ToList();
  //生成的Sql
  //SELECT * FROM [Order]  WHERE [id] > @p0 AND [name] = @p1
  
  
  参数说明:
  (1)变量
  {string}:a  等于 @p ,new {p=a.ToString()}
  
  (2)拼接符号
  ">"">=""<""<=""("")""=""||""&&","&","|","null","is","isnot"
  //like  nolike  (5.1.3.31-Privew05版本支持)
  
  
  (3)函数
  {SqlFunc_AggregateMin:["id"]} 
  
  (4)字段 不是上面3种就认为是字段(会进行严格SQL注入验证)
   id 就会变成 "id" 或者 [id] 或者 id

7.3Where简单SQL

用起来简单 对多库兼容差

db.Queryable<object>().AS("Order").Where("id=@id".new {id=1}).ToList();