首页 > 数据库 >SqlSugar的Repository

SqlSugar的Repository

时间:2024-01-16 15:47:41浏览次数:37  
标签:Repository db 仓储 base var new SqlSugar

1、仓储说明

仓储可以让你的方法更加的规范,需要什么方法都封装到仓储中,下次就能重复使用,并且能很好的和你业务拆分开

 这种设计模式简单粗暴用起来也方便 ,文章下面有可以运行的DEMO

 

2、仓储方法

仓储有一套自带的数据库操作方法,比起 db.xx.xxx来说可能更简便些满足一些常用需求, 复杂的功能还是用db.xxx.xxx

//查询 var data1 = base.GetById(1);//根据id查询 var data2 = base.GetList();//查询所有 (FindList) var data3 = base.GetList(it => it.Id == 1); //TOP1条件 var data4 = base.GetSingle(it => it.Id == 1);//查询单条记录,结果集不能超过1,不然会提示错误 var  data= base.GetFirst(it => it.Id == 1);//查询第一条记录 var p = new PageModel() { PageIndex = 1, PageSize = 2 }; var data5 = base.GetPageList(it => it.Name == "xx", p); Console.Write(p.PageCount); var data6 = base.GetPageList(it => it.Name == "xx", p, it => it.Name, OrderByType.Asc); Console.Write(p.PageCount); List<IConditionalModel> conModels = new List<IConditionalModel>(); conModels.Add(new ConditionalModel(){FieldName="id",ConditionalType=ConditionalType.Equal,FieldValue="1"});//id=1 var data7 = base.GetPageList(conModels, p, it => it.Name, OrderByType.Asc); var data8 = base.AsQueryable().Where(x => x.Id == 1).ToList();//使用Queryable   //插入 base.Insert(insertObj); base.InsertRange(InsertObjs); var id = base.InsertReturnIdentity(insertObj);//插入返回自增 var SnowflakeId=base.InsertReturnSnowflakeId(insertObj);//插入返回雪花ID base.AsInsertable(insertObj).ExecuteCommand();//复杂功能使用Insertable     //删除 base.Delete(T);//实体删除 需要有主键 base.Delete(List<T>);//集合删除 需要有主键 base.DeleteById(1); base.DeleteByIds(new object [] { 1, 2 }); //数组带是 ids方法 ,封装传 object [] 类型 //技巧 int [] 转换成 object[]  写法:ids.Cast<object>().ToArray() base.Delete(it => it.Id == 1); base.AsDeleteable().Where(it => it.Id == 1).ExecuteCommand();//复杂功能用 Deleteable   //实体方式更新更新 base.Update(insertObj);  base.UpdateRange(InsertObjs);  base.AsUpdateable(insertObj).UpdateColumns(it=>new { it.Name }).ExecuteCommand();//复杂功能用 Updateable    //表达式方式更新 base.Update(it => new Order() { Name = "a" /*可以多列*/ }, it => it.Id == 1); //只更新name 并且id=1 base.UpdateSetColumnsTrue(it=>new Order(){ Name = "a" }, it =>it.Id == 1);//更新name+过滤事件赋值字段  base.AsUpdateable().SetColumns(it=>new  Order{  Name="a" })                    .Where(it=>it.Id==1).ExecuteCommand();//复杂功能用 Updateable      //高级操作 base.Context //获取db对象 base.AsSugarClient // 获取完整的db对象 base.AsTenant  // 获取多库相关操作   //如果Context是子Db base.Context.Root//可以用Root拿主Db base.Context.Root.AsTenant()//拿到租户对象     //切换仓储 (可以注入多个仓储取代,这样就不用切换了) base.ChangeRepository<Repository<OrderItem>>() //多租户用法有区别:https://www.donet5.com/Home/Doc?typeId=2405 base.Change<OrderItem>()//只支持自带方法和单库

 

3、创建仓储

3.1 创建仓储

只需要几行代码就搞定了,我们定义的Repository是公用类,不能包含具体的类务逻辑,即使不使用扩展方法自带的方法也够开发

public class Repository<T> : SimpleClient<T> where T : classnew() {     public Repository(ISqlSugarClient db)     {                  base.Context=db;      }       /// <summary>     /// 扩展方法,自带方法不能满足的时候可以添加新方法     /// </summary>     /// <returns></returns>     public List<T> CommQuery(string json)     {        //base.Context.Queryable<T>().ToList();可以拿到SqlSugarClient 做复杂操作        return null;     }       }

4、使用仓储

4.1 通过IOC使用仓储

//注入仓储 builder.Services.AddScoped(typeof(Repository<>));   //注入SqlSugar  ...省略,不会看入门     //多个可以在构造函数写多个(用这种方式就不需要切换仓储了,有几个注入几个) public WeatherForecastController(Repository<Order> repOrder,Repository<Custom> repCustom) {      _repOrder= repOrder;      _repCustom=repCustom; }       //使用注入的仓储 _repOrder.Insert(data); _repOrder.Context.Queryable<T>().ToList();//.Context可以拿到db对象      //创建的仓储  public class Repository<T> : SimpleClient<T> where T : classnew() {     public Repository(ISqlSugarClient db)//因为不需要切换仓储所以可以直接用构造函数获取db     {         base.Context=db;       } }

4.2 不用IOC使用仓储

 //该用例建议升级5.1.3.35以上版本  public class UserService : IUserService, IDynamicApiController, ITransient//接口根据业务可以不需要  {         //也可以用Ioc注入,不注入更方便些( ”=>" 表示用的时候才去new,不会在实例化类时候去new          Repository<Abpusers> _userRepository => new Repository<Abpusers>();//Repository不能单例         ISqlSugarClient _db=>_userRepository.Context;           /// <summary>         /// 获取用户列表         /// </summary>         /// <returns></returns>         public async Task<List<GetUserDto>> Get()         {             var users = await _userRepository.GetListAsync();             return users.Adapt<List<GetUserDto>>();         }   }      public class Repository<T> : SimpleClient<T> where T : classnew() {     public Repository()      {       base.Context=DbHelper.GetDbInstance()           } }

注意:因为支持获取外部仓储,所以不需要像ABP那样构造函数写一堆

//获取外部仓储 var itemDal=_userRepository.ChangeRepository<Repository<OrderItem>>(); var orderDal=_userRepository.ChangeRepository<Repository<Order>>(); //base.Change<OrderItem>()这种写法与上面区别在于只能用ORM中的方法,没办法使用扩展类中的方法

DEMO下载: SqlSugarDemo.rar

4.3 db直接调用仓储

//使用ORM自带的仓储 var orderDal= db.GetSimpleClient<Order>();   //使用自定义的仓储  5.1.3.28-preview06 var orderDal=db.GetRepository<Repository<Order>>();//3.1有介绍自定义仓储如创建   //使用仓储方法 orderDal.Insert(data);

5、调用外部仓储

操作Order表的同时,我还想使用OrderItem这个仓储怎么办? 

var orderItemDb = _userRepository.ChangeRepository<Repository<OrderItem>>();   public Repository(ISqlSugarClient db==null)//这儿要改成可空 {                  base.Context=db;  }    //如果是多库模式需要注入,打开面页看标题4 //https://www.donet5.com/Home/Doc?typeId=2405

 

6、仓储中使用事务

注意: 如果是多租户事务写法有差异,看标题7

    try     {         _userRepository.AsTenant().BeginTran();           //你的增查改方法            _userRepository.AsTenant().CommitTran();      }      catch (Exception ex)      {         _userRepository.AsTenant().RollbackTran();                           throw;      }

注意: 如果是多租户事务写法有差异,看标题7

 

7、多租户使用仓储

因为要多个仓储用一个SqlSugarClient,我们需要用到Sugar.Ioc进行DB共享

https://www.donet5.com/Home/Doc?typeId=2405

 

标签:Repository,db,仓储,base,var,new,SqlSugar
From: https://www.cnblogs.com/yswenli/p/17967816

相关文章

  • SqlSugar的查询函数SqlFunc
    用法我们可以使用SqlFunc这个类调用Sql函数,用法如下:db.Queryable<Student>().Where(it => SqlFunc.ToLower(it.Name) == SqlFunc.ToLower("JACK")).ToList(); C#函数支持一些常用的C#函数.ToString .Contains .Length.ToLower .ToUpper .ToSubstrin......
  • SqlSugar的Where用法
    1、普通表达式查询//id=@idvar list=db.Queryable<Student>().Where(it => it.Id == id).ToList(); //多个条件var list2=db.Queryable<Student>().WhereIF(id>0,it => it.Id == id)// 如果id>0 添加条件 id=@id  .WhereIF(name!=null,it => it.nam......
  • SqlSugar的Select用法
    Select位置正常情况:应该在最后面,一般是.Where(..).OrderBy(..).Select(..).ToList()特殊情况:如果Select不是最后一个位置,则Select要加MergeTable()合并成一个表,Select(...).MergeTable().Where语法糖:Select(...).MergeTable()在新版本中可以用SelectMergeTable(it=>newx......
  • SqlSugar跨库查询/多库查询
    一、跨库方式1:跨库导航(5.1.3.24)优点1:支持跨服务器,支持跨数据库品种,支持任何类型数据库 优点2:  超级强大的性能,能达到本库联表性能缺点:不支持子表过滤主表(方案有ToList后在内存过滤,如果分页可以查前1000条主表在内存分页前端只显示前10页)[Tenant("db2")] //......
  • SqlSugar新增数据
    1、插入方式1.1单条插入实体//返回插入行数db.Insertable(insertObj).ExecuteCommand(); //都是参数化实现//异步: await db.Insertable(insertObj).ExecuteCommandAsync() //插入返回自增列 (实体除ORACLE外实体要配置自增,Oracle需要配置序列)db.Insertable(in......
  • SqlSugar更新数据
    1、根据实体对象更新所谓按实体对象更新就是:db.Updateable(参数对象)有参数的重载db.Updateable(实体或者集合).ExecuteCommand() //右标题1 下面的所有菜单优点1、代码少2、支持各种批量修改缺点1、不支持表达式和sql函数2、依赖 实体对象,没实体对象就需......
  • SqlSugar删除数据
    1、根据实体删除1.1强类型实体 需要配置主键,根据主键删除需要给实体配置主键,参考文档实体配置//单个实体db.Deleteable<Student>(new Student() { Id = 1 }).ExecuteCommand(); //List<实体> (可以不加Where)List<Student> list=new List<Student>(){......
  • 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......
  • SqlSugar分组查询
    一、分组查询和使用1.1语法只有在聚合对象需要筛选的时候才会用到Having,一般分组查询用不到可以去掉  var list = db.Queryable<Student>()             .GroupBy(it => new { it.Id, it.Name }) //可以多字段             .Whe......
  • SqlSugar分页查询
    同步分页 int pagenumber= 1; // pagenumber是从1开始的不是从零开始的 int pageSize = 20; int totalCount=0; //单表分页 var page = db.Queryable<Student>().ToPageList(pagenumber, pageSize, ref totalCount); //如果SqlServer不想有Rownumb......