基于Dapper的开源Lambda扩展,且支持分库分表自动生成实体
LnskyDB
LnskyDB是基于Dapper的Lambda扩展,支持按时间分库分表,也可以自定义分库分表方法.而且可以T4生成实体类免去手写实体类的烦恼.
开源地址 https://github.com/liningit/LnskyDB
在此非常感谢SkyChenSky其中lambda表达式的解析参考了他的开源项目
下面是用ProductSaleByDayEntity作为示例,其中StatisticalDate为分库分表字段,如果是对分库分表对象进行数据库操作则必须传入StatisticalDate或者设置DBModel_ShuffledTempDate指定是那个库和表
1. 仓储的创建
仓储的创建有两种方式一种是通过RepositoryFactory.Create<ProductSaleByDayEntity>()
创建IRepository<ProductSaleByDayEntity>
还有一种是创建一个仓储类继承Repository<ProductSaleByDayEntity>
public interface IProductSaleByDayRepository : IRepository<ProductSaleByDayEntity> { } public class ProductSaleByDayRepository : Repository<ProductSaleByDayEntity> { } //调用的地方可以 IProductSaleByDayRepository repository=new ProductSaleByDayRepository();
2. 查询
2.1 根据主键查询
var repository = RepositoryFactory.Create<ProductSaleByDayEntity>(); var entity = repository.Get(new ProductSaleByDayEntity { DBModel_ShuffledTempDate = new DateTime(2019, 01, 01),//这儿表示差19年1月的库和表 SysNo = sysNo });
2.2 根据where条件查询
var stTime = new DateTime(2019, 1, 15); var endTime = new DateTime(2019, 2, 11); var repository = RepositoryFactory.Create<ProductSaleByDayEntity>(); var query = QueryFactory.Create<ProductSaleByDayEntity>(m => m.ShopName.Contains("测试")); query.And(m => m.StatisticalDate >= stTime); query.And(m => m.StatisticalDate < endTime.Date.AddDays(1)); query.OrderByDescing(m => m.StatisticalDate);//如果是查多个库表必须按分库分表的字段降序排列 query.StarSize = 20; //可以设置查询行数及开始行数 query.Rows = 10; //分库的传入stTime,endTime会自动根据时间查询符合条件的库和表 var lst = repository.GetList(query, stTime, endTime);
如果可以确定统计时间也可以查指定的库表进行单表查询
var stTime = new DateTime(2019, 1, 15); var endTime = new DateTime(2019, 1, 18); var repository = RepositoryFactory.Create<ProductSaleByDayEntity>(); var query = QueryFactory.Create<ProductSaleByDayEntity>(m => m.ShopName.Contains("测试")); query.And(m => m.StatisticalDate >= stTime); query.And(m => m.StatisticalDate < endTime.Date.AddDays(1)); query.DBModel.DBModel_ShuffledTempDate = new DateTime(2019, 01, 01);//这儿表示查19年1月的库和表 query.OrderByDescing(m => m.StatisticalDate);//单表查询可以随意排序 query.StarSize = 20; query.Rows = 10; var lst= repository.GetList(query);
2.3 分页查询
var stTime = new DateTime(2019, 1, 15); var endTime = new DateTime(2019, 2, 11); var repository = RepositoryFactory.Create<ProductSaleByDayEntity>(); var query = QueryFactory.Create<ProductSaleByDayEntity>(m => m.ShopName.Contains("测试")); query.And(m => m.StatisticalDate >= stTime); query.And(m => m.StatisticalDate < endTime.Date.AddDays(1)); query.OrderByDescing(m => m.StatisticalDate);//如果是查多个库表必须按分库分表的字段降序排列 query.StarSize = 20; query.Rows = 10; //分库的传入stTime,endTime会自动根据时间查询符合条件的库和表 var paging = repository.GetPaging(query, stTime, endTime); var count = paging.TotalCount; var lst = paging.ToList();//或者paging.Items
如果可以确定统计时间也可以查指定的库表
var stTime = new DateTime(2019, 1, 15); var endTime = new DateTime(2019, 1, 18); var repository = RepositoryFactory.Create<ProductSaleByDayEntity>(); var query = QueryFactory.Create<ProductSaleByDayEntity>(m => m.ShopName.Contains("测试")); query.And(m => m.StatisticalDate >= stTime); query.And(m => m.StatisticalDate < endTime.Date.AddDays(1)); query.DBModel.DBModel_ShuffledTempDate = new DateTime(2019, 01, 01);//这儿表示查19年1月的库和表 query.OrderByDescing(m => m.StatisticalDate);//单表查询可以随意排序 query.StarSize = 20; query.Rows = 10; var paging= repository.GetPaging(query); var count = paging.TotalCount; var lst = paging.ToList();//或者paging.Items
3. 添加
var addEntity = new ProductSaleByDayEntity() { SysNo = Guid.NewGuid(), DataSource = "测试来源", ProductID = Guid.NewGuid(), ShopID = Guid.NewGuid(), ShopName = "测试店铺", ProductName = "测试商品", OutProductID = Guid.NewGuid().ToString(), ImportGroupId = Guid.NewGuid(), StatisticalDate = DateTime.Now//分库分表字段是必须的 }; var repository = RepositoryFactory.Create<ProductSaleByDayEntity>(); //如果新增主键是自增列会自动赋值自增列值到主键 repository.Add(addEntity);
4. 更新
4.1 根据主键更新
var updateEntity = new ProductSaleByDayEntity() { SysNo = Guid.Parse("650BC09C-2B9C-467B-A457-8B4853CC1F0F"), DataSource = "测试来源修改", ShopName = "店铺修改", StatisticalDate = new DateTime(2019,01,05),//如果StatisticalDate赋值了则根据StatisticalDate找库表,然后根据主键更新,StatisticalDate也会被更新成所赋的值 //如果不想更新StatisticalDate可以用下面这句话 // DBModel_ShuffledTempDate=new DateTime(2019,01,05),//如果不想更新StatisticalDate字段则用这句话来确定是那个库及表 }; var repository = RepositoryFactory.Create<ProductSaleByDayEntity>(); //根据主键更新其他字段 return repository.Update(updateEntity);
4.2 根据where条件更新
var updateEntity = new ProductSaleByDayEntity() { DataSource = "测试来源修改", ShopName = "店铺修改Where", DBModel_ShuffledTempDate = new DateTime(2019, 01, 05),//如果用这句话来确定是那个库表 // StatisticalDate = statisticalDate,//如果要更新StatisticalDate则可以用这句话替代上面那句话 }; var repository = RepositoryFactory.Create<ProductSaleByDayEntity>(); var where = QueryFactory.Create<ProductSaleByDayEntity>(m => m.ShopName == "测试店铺1" && m.StatisticalDate > new DateTime(2019, 01, 03));//where是更新条件 //注意如果是更新用的是实体类的DBModel_ShuffledTempDate Query中的无效 return repository.Update(updateEntity, where);
5. 删除
5.1 根据主键删除
var deleteEntity = new ProductSaleByDayEntity() { SysNo = Guid.Parse("650BC09C-2B9C-467B-A457-8B4853CC1F0F"), DBModel_ShuffledTempDate = new DateTime(2019, 01, 05),//对于分库分表来说DBModel_ShuffledTempDate是必须的用来确认是那个库表 }; var repository = RepositoryFactory.Create<ProductSaleByDayEntity>(); return repository.Delete(deleteEntity);
5.2 根据where条件删除
var repository = RepositoryFactory.Create<ProductSaleByDayEntity>(); var where = QueryFactory.Create<ProductSaleByDayEntity>(); where.DBModel.DBModel_ShuffledTempDate = new DateTime(2019, 01, 01); //QueryiSearch方法表示搜索里面空格表示或+表示且 //如 导入+手工 自动+生成 表示字段必须同时拥有导入和手工或者自动和生成 //生成sql是 and ((DataSource like '%导入%' and DataSource like '%手工%') or DataSource like '%自动%' and DataSource like '%生成%') where.QueryiSearch(m => m.DataSource, "新+更"); where.QueryiSearch(m => m.ShopName, "批量修改"); //注意如果是更新用的是实体类的DBModel_ShuffledTempDate Query中的无效 return repository.Delete(where);
6. 多线程处理
对于mvc每次请求都会在请求结束时将数据库连接关闭,如果是新建线程则需要在线程开始调用DBTool.BeginThread();
并且在线程结束为止调用DBTool.CloseConnections();
关闭连接
public class ThreadTool { public static void QueueUserWorkItem(Action action) { ThreadPool.QueueUserWorkItem(delegate { DBTool.BeginThread(); try { action(); } finally { DBTool.CloseConnections(); } }); } } ThreadTool.QueueUserWorkItem(ThreadDo);//调用
7. 实体类T4自动生成
在LnskyDB.Demo\T4中有可以自动生成实体类的T4模版. 其中DbHelper.ttinclude中的Config是配置数据库的 Entity.tt是生成实体的T4模版.大家可以根据自己的情况修改

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Linux中如何保证数据安全落盘
背景 在很多IO场景中,我们经常需要确保数据已经安全的写到磁盘上,以便在系统宕机重启之后还能读到这些数据。但是我们都知道,linux系统的IO路径还是很复杂的,分为很多层,每一层都可能会有buffer来加速IO读写。同时,用户态的应用程序和库函数也可能拥有自己的buffer,这又给IO路径增加了一些复杂性。可见,要想保证数据安全的写到磁盘上,并不是简单调一个write/fwrite就可以搞定的。 那么要怎么做呢?很多人会想到很多办法,比如:fflush()、fsync()、fdatasync()、sync()、open()使用O_DIRECT或O_SYNC标志等。嗯,这些手段(或者某些组合)的确可以保证数据安全的持久化,那么它们之间有什么区别呢?fflush()和fsync()有啥区别?O_DIRECT是啥意思,它可以保证数据安全的持久化吗?O_DIRECT和O_SYNC区别什么?O_SYNC和fsync()呢?fsync能完成msync的功能吗?本文将试图理解、解释这些概念的作用和区别。 Linux IO 所谓一图胜千言,为了解析清楚这些概念的区别,我特意画了一张图...
- 下一篇
解读 Kylin 3.0.0 | 更敏捷、更高效的 OLAP 引擎
在近期的 Apache Kylin Meetup 成都站上,我们邀请到 Kyligence 架构师 & Apache Kylin Committer 倪春恩对 Kylin3.0.0 版本的一些重要功能及改进从使用到原理进行了介绍: Apache Kylin 在今年 4 月 18 日发布了 3.0.0 Alpha 版本,我今天的分享也围绕Release notes内提到的三个功能,即:基于 Curator 的作业调度器,使用 Apache Livy 提交 Spark 任务,实时 OLAP。 基于 Curator 的作业调度器 首先讲一下作业调度器。Kylin 支持集群部署, Kylin 实例主要有三种模式。一种是 Job 模式(用作任务构建),一种是 Query 模式(用作 Query 查询),配置成all模式的节点既做 Query 节点又做 Job节点。之前,我们需要先设置配置项,配置 kylin.server.cluster-servers 为集群中所有节点,这样各节点便可互相通信,比如元数据的同步。 我们可以通过 Ngnix 等工具配一个对 Kylin 集群查询的多活,即...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- Docker安装Oracle12C,快速搭建Oracle学习环境
- CentOS7安装Docker,走上虚拟化容器引擎之路
- Linux系统CentOS6、CentOS7手动修改IP地址
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- CentOS关闭SELinux安全模块
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- Hadoop3单机部署,实现最简伪集群
- CentOS6,7,8上安装Nginx,支持https2.0的开启