zoukankan      html  css  js  c++  java
  • .net 简单的数据库操作框架

    介绍

    SqlSugar是一款 老牌 .NET数据库操作框架,由果糖大数据科技团队维护和更新 ,Github star数仅次于EF 和 Dapper

    优点: 简单易用、功能齐全、高性能、轻量级、服务齐全、有专业技术支持一天18小时服务

    支持数据库:MySql、SqlServer、Sqlite、Oracle 、 postgresql、达梦、人大金仓

    框架新功能

    最新稳定版本5.0.2.8 ,发布后1个月时间NUGET下载量达到5000的版本,用户使用也相当满意

    而在稳定版本的基础上又布了5.0.2.9版本

    加入3大新功能

    1. 配置查询 

    解决了大量字典表和简单就为取一个name 就要写联表的问题,让单表查询解决一切

    2.多租户+仓储+自动分配

    3.行转列

    1、配置查询

    解决了大量字典表和简单就为取一个name 就要写联表的问题,让单表查询解决一切

    字典表我相信大家都全用到,他们可以方便的存储性别、学历、岗位等 一串数据 并进行TypeId进行区分

    1.1 创建测试数据

    创建一个字典实体

        public class DataDictionary
        {
            public string Code { get; set; }
            public string Name { get; set; }
            public string Type { get; set; }
        }
    

    创建字典表并向里面插入测试数据  

    var db = GetInstance();
                List<DataDictionary> datas = new List<DataDictionary>();
                datas.Add(new DataDictionary() { Code="1", Name="男",Type="sex" });
                datas.Add(new DataDictionary() { Code = "2", Name = "女", Type = "sex" });
                datas.Add(new DataDictionary() { Code = "1", Name = "南通市", Type = "city" });
                datas.Add(new DataDictionary() { Code = "2", Name = "苏州市", Type = "city" });
                datas.Add(new DataDictionary() { Code = "1", Name = "江苏省", Type = "province" });
                datas.Add(new DataDictionary() { Code = "2", Name = "湖南省", Type = "province" });
    
                db.CodeFirst.InitTables<DataDictionary>();//这样就能根据实体建表了
                db.Insertable(datas).ExecuteCommand();//这样就能把数据插进数据库了

    在建一个Person表  

        public class Person 
        {
            //数据库字段
            [SqlSugar.SugarColumn(IsPrimaryKey =true,IsIdentity =true)]
            public int Id { get; set; }
            public string Name { get; set; }
            public int SexId { get; set; }
            public int CityId { get; set; }
            public int ProvinceId { get; set; }
    
            //非数据库字段
            [SqlSugar.SugarColumn(IsIgnore =true)]
            public string SexName { get; set; }
            [SqlSugar.SugarColumn(IsIgnore = true)]
            public string CityName { get; set; }
            [SqlSugar.SugarColumn(IsIgnore = true)]
            public string ProviceName { get; set; }
        } 

    1.2 传统字典联表实现缺点

    如果我们要将Person中的非数据字典查询出来那么我们就需要写有2种实现方式

    1.连表或者子查询 (缺点 写起来很浪费时间

    2.将字典存到内存,通过内存赋值 (缺点 字典表超过1000条以上性能很差 ,并且不能排序,或者LIKE

    下面介绍通过SqlSugar的配置查询解决上2面个难题

    1.3 配置表简化字典联表

    配置字典表

    if (!db.ConfigQuery.Any()) 
       {
                    var types= db.Queryable<DataDictionary>().Select(it => it.Type).Distinct().ToList();
                    foreach (var type in types)
                    {
                        db.ConfigQuery.SetTable<DataDictionary>(it => it.Code, it => it.Name, type, it => it.Type == type);
                    }
                    //如果其中Code都是唯一值可以按 1.4中的用法使用循环都不要
    }

    配置完我们查询就会很方便了

       var res=db.Queryable<Person>().Select(it => new Person()
       {
                     Id=it.Id.SelectAll(),
                     SexName=it.SexId.GetConfigValue<DataDictionary>("sex"),
                     ProvinceName = it.ProvinceId.GetConfigValue<DataDictionary>("province"),
                     CityName = it.CityId.GetConfigValue<DataDictionary>("city"),
       }).ToList();
    
    //也支持支持写在Where或者Orderby 

    1.4 简单联表查询也可以配置

     db.ConfigQuery.SetTable<Order>(it => it.Id, it => it.Name);//配置Order
    var list3 = db.Queryable<OrderItem>().Select(it => new OrderItem { ItemId = it.ItemId.SelectAll(), OrderName = it.OrderId.GetConfigValue<Order>() //查询的时候直接用 }).ToList();

     总结:配置表查询的方式可以大大降低重复联表问题,并且配置好后基本就不要写JOIN了 

      

    2、多租户+仓储+自动分配

    SqlSugar多租户是通过ConfigId进行识别连接哪个库,新版本添加了实体配置ConfigId

          [TenantAttribute("1")]
            public class C1Table 
            {
               public string Id { get; set; }
            }
    
            [TenantAttribute("2")]
            public class C2Table
            {
                public string Id { get; set; }
            }
    

      

    下面我们仓储就可以通过实体配置自动识别是连接哪个库   

        public class Repository<T> : SimpleClient<T> where T : class, new()
            {
                public Repository(ISqlSugarClient context = null) : base(context)//注意这里要有默认值等于null
                {
                    if (context == null)
                    {
                        var db = new SqlSugarClient(new List<ConnectionConfig> {
                                                            new ConnectionConfig()
                                                        {
                                                            ConfigId="1",
                                                            DbType = SqlSugar.DbType.SqlServer,
                                                            IsAutoCloseConnection = true,
                                                            ConnectionString = Config.ConnectionString
                                                        },
                                                            new ConnectionConfig()
                                                        {
                                                            ConfigId="2",
                                                            DbType = SqlSugar.DbType.SqlServer,
                                                            IsAutoCloseConnection = true,
                                                            ConnectionString = Config.ConnectionString2
                                                        }
                        });
                        base.Context = db;
                        var configId = typeof(T).GetCustomAttribute<TenantAttribute>().configId;
                        db.ChangeDatabase(configId);
                    }
                }
    
                /// <summary>
                /// 扩展方法,自带方法不能满足的时候可以添加新方法
                /// </summary>
                /// <returns></returns>
                public List<T> CommQuery(string sql)
                {
                    //base.Context.Queryable<T>().ToList();可以拿到SqlSugarClient 做复杂操作
                    return base.Context.Queryable<T>().Where(sql).ToList();
                }
    
            }
    

      

    新版本还添加了切换仓储功能

            public class C1Service : Repository<C1Table>
            {
                public void Test() 
                {
                    base.AsTenant().BeginTran();
    
                    base.GetList(); //调用内部仓储方法
                    base.ChangeRepository<Repository<C2Table>>().GetList();//调用外部仓储
    
                    base.AsTenant().CommitTran();
                }
            }
    

      

     3、行列互转功能 

    第一个参数 列名、第二个参数 头行名、第三个参数 值

     var test06 = db.Queryable<Order>()
                       .ToPivotTable(it => it.Id, it => it.Name, it => it.Sum(x => x.Price));//返回Datatable
    
     var test07 = db.Queryable<Order>()
                .ToPivotList(it => it.Id, it => it.Name, it => it.Sum(x => x.Price));//返回List<dynamic>
    var test08 = db.Queryable<Order>() .ToPivotJson(it => it.Id, it => it.Name, it => it.Sum(x => x.Price));//返回Json

    .NET数据库框架源码  

    官网地址:  https://www.donet5.com/Home/Doc

  • 相关阅读:
    OpenSeadragon 基础显示图片 学习记录 (一)
    数组篇【第一集】
    css如何让页面上的文字不能选中??
    toggleClass()原来是这么用的
    vue-gemini-scrollbar(vue组件-自定义滚动条)
    css绝对底部的实现方法
    Select下拉框需求
    iview之Model对话框封装
    Java基础(一)
    vue-draggable-resizable插件的API记录
  • 原文地址:https://www.cnblogs.com/sunkaixuan/p/14701585.html
Copyright © 2011-2022 走看看