.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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM