ORM 创新解放劳动力 -SqlSugar 新功能介绍
介绍
SqlSugar是一款 老牌 .NET 开源ORM框架,由果糖大数据科技团队维护和更新 ,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);
在建一个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 ProviceId { 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);
}
}
配置完我们查询就会很方便了
var res=db.Queryable<Person>().Select(it => new Person()
{
Id=it.Id.SelectAll(),
SexName=it.SexId.GetConfigValue<DataDictionary>("sex"),
ProviceName = it.SexId.GetConfigValue<DataDictionary>("province"),
CityName = it.SexId.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
}
});
var configId = typeof(T).GetCustomAttribute<TenantAttribute>().configId;
base.Context = db.GetConnection(configId);//根据实体的租户Id自动实别连接字符串
}
} /// <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
ORM 创新解放劳动力 -SqlSugar 新功能介绍的更多相关文章
- CentOS以及Oracle数据库发展历史及各版本新功能介绍, 便于构造环境时有个对应关系
CentOS版本历史 版本 CentOS版本号有两个部分,一个主要版本和一个次要版本,主要和次要版本号分别对应于RHEL的主要版本与更新包,CentOS采取从RHEL的源代码包来构建.例如CentOS ...
- 原创开源项目HierarchyViewer for iOS 2.1 Beta新功能介绍
回顾 HierarchyViewer for iOS是我们发布的一个开源项目,采用GPL v3.0协议. HierarchyViewer for iOS可以帮助iOS应用的开发和测试人员,在没有源代码 ...
- fedora21发布与新功能介绍(附fedora21安装教程与fedora21下载地址)
fedora21发布与新功能介绍(附fedora21安装教程与fedora21下载地址) 最新的Fedora 21终于正式发布了,Fedora Server 是一款强大可定制化的操作系统,包括了最好最 ...
- Unity User Group 北京站:《Unity5.6新功能介绍以及HoloLens开发》
时间一转眼从春天来到了初夏,Unity User Group(以下简称UUG)活动也迎来了第七期.我们面向Unity3D开发从业者以及未来想从事Unity3D开发的学生群体的UUG活动这次仍然在海淀 ...
- Eviews 8.0&9.0界面新功能介绍
Eviews 8.0&9.0界面新功能介绍 本文其中一些是自己的整理,也有一些是经管之家论坛中一位热心.好学坛友的整理,其中只是简单介绍一下这两个新版本的部分特性,分享出来,有兴趣的看客可以一 ...
- Kafka 0.11新功能介绍:空消费组延迟rebalance
Kafka 0.11新功能介绍:空消费组延迟rebalance 在0.11之前的版本中,多个consumer实例加入到一个空消费组将导致多次的rebalance,这是由于每个consumer inst ...
- DevExpress v15.2新功能介绍视频(25集全)
DevExpress v15.2新功能介绍视频(25集全) http://www.devexpresscn.com/Resources/Documentation-508.html DevExpres ...
- 【Linux】Ubuntu18.04镜像下载,新功能介绍
一.Ubuntu18.04镜像下载 官方下载地址:http://releases.ubuntu.com/18.04/ 官方64位iso下载地址:http://releases.ubuntu.com/1 ...
- Java 14 新功能介绍
不做标题党,认认真真写个文章. 文章已经收录在 Github.com/niumoo/JavaNotes 和未读代码博客,点关注,不迷路. Java 14 早在 2019 年 9 月就已经发布,虽然不是 ...
随机推荐
- linux查看目录文件以及子目录文件大小的命令
可以使用以下命令,不过如果文件比较多,因为是递归统计大小的的,所以结果出来的会比较慢,需要等待. du -h --max-depth=1 * 以下是命令的说明 du [-abcDhHklmsSx] [ ...
- 痞子衡嵌入式:系统时钟配置不当会导致i.MXRT1xxx系列下OTFAD加密启动失败
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是系统时钟配置不当会导致i.MXRT1xxx系列下OTFAD加密启动失败问题. 我们知道,i.MXRT1xxx家族早期型号(RT1050/ ...
- (数据科学学习手札109)Python+Dash快速web应用开发——静态部件篇(中)
本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 这是我的系列教程Python+Dash快速web ...
- SpringBoot(十):SpringBoot的简单事务管理
SpringBoot集成Mybatis之后,进行事务管理.SpringBoot使用事务非常简单,底层依然采用的是Spring本身提供的事务. 1.在入口类中使用注解@EnableTransaction ...
- 箭头函数this的指向
箭头函数的this 什么是箭头函数,箭头函数是es6的新特性,其出现就是为了更好的表示(代替)回调函数 // 箭头函数 (arg1, arg2) => {} // 当箭头函数只有一个参数 arg ...
- javascript中的内存管理
目录 简介 内存生命周期 JS中的垃圾回收器 引用计数垃圾回收算法 Mark-and-sweep回收算法 调试内存问题 闭包Closures中的内存泄露 javascript中的内存管理 简介 在c语 ...
- 【开源】.net微服务开发引擎Anno 让复杂的事简单点- 日志、链路追踪一目了然 (上)
1.Anno简介? Anno是一个微服务框架引擎.入门简单.安全.稳定.高可用.全平台可视化监控.依赖第三方框架少.详情请查看<[开源].net微服务开发引擎Anno开源啦> 本章主题:. ...
- KL散度相关理解以及视频推荐
以下内容基于对[中字]信息熵,交叉熵,KL散度介绍||机器学习的信息论基础这个视频的理解,请务必先看几遍这个视频. 假设一个事件可能有多种结果,每一种结果都有其发生的概率,概率总和为1,也即一个数据分 ...
- MySQL全面瓦解24:构建高性能索引(策略篇)
学习如果构建高性能的索引之前,我们先来了解下之前的知识,以下两篇是基础原理,了解之后,对面后续索引构建的原则和优化方法会有更清晰的理解: MySQL全面瓦解22:索引的介绍和原理分析 MySQL全面瓦 ...
- ClickHouse元数据异常-MySQLHandlerFactory:Failed to read RSA key pair from server
Clickhouse版本:20.3.6.40-2 clickhouse集群三个节点,一分片,三副本,三个节点数据完全一样 1. 问题描述 在使用连接工具操作时,发现其中一个节点连接拒绝,无法操作,另外 ...