博客
关于我
.net 简单的数据库操作框架
阅读量:453 次
发布时间:2019-03-06

本文共 6431 字,大约阅读时间需要 21 分钟。

介绍

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
datas = new List
(); 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
();//这样就能根据实体建表了 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
().Select(it => it.Type).Distinct().ToList(); foreach (var type in types) { db.ConfigQuery.SetTable
(it => it.Code, it => it.Name, type, it => it.Type == type); } //如果其中Code都是唯一值可以按 1.4中的用法使用循环都不要}

 

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

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

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

db.ConfigQuery.SetTable
(it => it.Id, it => it.Name);//配置Order var list3 = db.Queryable
().Select(it => new OrderItem { ItemId = it.ItemId.SelectAll(), OrderName = it.OrderId.GetConfigValue
() //查询的时候直接用 }).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
: SimpleClient
where T : class, new() { public Repository(ISqlSugarClient context = null) : base(context)//注意这里要有默认值等于null { if (context == null) { var db = new SqlSugarClient(new List
{ 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
().configId; db.ChangeDatabase(configId); } } ///
/// 扩展方法,自带方法不能满足的时候可以添加新方法 /// ///
public List
CommQuery(string sql) { //base.Context.Queryable
().ToList();可以拿到SqlSugarClient 做复杂操作 return base.Context.Queryable
().Where(sql).ToList(); } }

  

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

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

  

 3、行列互转功能 

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

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

 

  

官网地址:  

转载地址:http://shofz.baihongyu.com/

你可能感兴趣的文章
mysql 查询数据库所有表的字段信息
查看>>
【Java基础】什么是面向对象?
查看>>
mysql 查询,正数降序排序,负数升序排序
查看>>
MySQL 树形结构 根据指定节点 获取其下属的所有子节点(包含路径上的枝干节点和叶子节点)...
查看>>
mysql 死锁 Deadlock found when trying to get lock; try restarting transaction
查看>>
mysql 死锁(先delete 后insert)日志分析
查看>>
MySQL 死锁了,怎么办?
查看>>
MySQL 深度分页性能急剧下降,该如何优化?
查看>>
MySQL 深度分页性能急剧下降,该如何优化?
查看>>
MySQL 添加列,修改列,删除列
查看>>
mysql 添加索引
查看>>
MySQL 添加索引,删除索引及其用法
查看>>
mysql 状态检查,备份,修复
查看>>
MySQL 用 limit 为什么会影响性能?
查看>>
MySQL 用 limit 为什么会影响性能?有什么优化方案?
查看>>
MySQL 用户权限管理:授权、撤销、密码更新和用户删除(图文解析)
查看>>
mysql 用户管理和权限设置
查看>>
MySQL 的 varchar 水真的太深了!
查看>>
mysql 的GROUP_CONCAT函数的使用(group_by 如何显示分组之前的数据)
查看>>
MySQL 的instr函数
查看>>