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

  • 相关阅读:
    使用NBU进行oracle异机恢复
    mycat偶尔会出现JVM报错double free or corruption并崩溃退出
    exp导出数据时丢表
    service_names配置不正确,导致dg创建失败
    XML概念定义以及如何定义xml文件编写约束条件java解析xml DTD XML Schema JAXP java xml解析 dom4j 解析 xpath dom sax
    HTTP协议简介详解 HTTP协议发展 原理 请求方法 响应状态码 请求头 请求首部 java模拟浏览器客户端服务端
    java集合框架容器 java框架层级 继承图结构 集合框架的抽象类 集合框架主要实现类
    【JAVA集合框架一 】java集合框架官方介绍 Collections Framework Overview 集合框架总览 翻译 javase8 集合官方文档中文版
    java内部类深入详解 内部类的分类 特点 定义方式 使用
    再谈包访问权限 子类为何不能使用父类protected方法
  • 原文地址:https://www.cnblogs.com/sunkaixuan/p/14701585.html
Copyright © 2011-2022 走看看