LnskyDB 基于Dapper的Lambda扩展开源项目

我要开发同款
匿名用户2019年06月14日
88阅读

技术信息

开源地址
https://github.com/liningit/LnskyDB
授权协议
MIT

作品详情

LskyDB是基于Dapper的Lambda扩展,支持按时间分库分表,也可以自定义分库分表方法.而且可以T4生成实体类免去手写实体类的烦恼.

在此非常感谢SkyCheSky其中lambda表达式的解析参考了他的开源项目

下面是用ProductSaleByDayEtity作为示例,其中StatisticalDate为分库分表字段,如果是对分库分表对象进行数据库操作则必须传入StatisticalDate或者设置DBModel_ShuffledTempDate指定是那个库和表

1.仓储的创建

仓储的创建有两种方式一种是通过RepositoryFactory.Create<ProductSaleByDayEtity>()创建IRepository<ProductSaleByDayEtity> 还有一种是创建一个仓储类继承Repository<ProductSaleByDayEtity>

publiciterfaceIProductSaleByDayRepository:IRepository<ProductSaleByDayEtity>{}publicclassProductSaleByDayRepository:Repository<ProductSaleByDayEtity>{}//调用的地方可以IProductSaleByDayRepositoryrepository=ewProductSaleByDayRepository();2.查询

2.1根据主键查询

varrepository=RepositoryFactory.Create<ProductSaleByDayEtity>();varetity=repository.Get(ewProductSaleByDayEtity{DBModel_ShuffledTempDate=ewDateTime(2019,01,01),//这儿表示差19年1月的库和表SysNo=sysNo});

2.2根据where条件查询

varstTime=ewDateTime(2019,1,15);varedTime=ewDateTime(2019,2,11);varrepository=RepositoryFactory.Create<ProductSaleByDayEtity>();varquery=QueryFactory.Create<ProductSaleByDayEtity>(m=>m.ShopName.Cotais("测试"));query.Ad(m=>m.StatisticalDate>=stTime);query.Ad(m=>m.StatisticalDate<edTime.Date.AddDays(1));query.OrderByDescig(m=>m.StatisticalDate);//如果是查多个库表必须按分库分表的字段降序排列query.StarSize=20;//可以设置查询行数及开始行数query.Rows=10;//分库的传入stTime,edTime会自动根据时间查询符合条件的库和表varlst=repository.GetList(query,stTime,edTime);

如果可以确定统计时间也可以查指定的库表进行单表查询

varstTime=ewDateTime(2019,1,15);varedTime=ewDateTime(2019,1,18);varrepository=RepositoryFactory.Create<ProductSaleByDayEtity>();varquery=QueryFactory.Create<ProductSaleByDayEtity>(m=>m.ShopName.Cotais("测试"));query.Ad(m=>m.StatisticalDate>=stTime);query.Ad(m=>m.StatisticalDate<edTime.Date.AddDays(1));query.DBModel.DBModel_ShuffledTempDate=ewDateTime(2019,01,01);//这儿表示查19年1月的库和表query.OrderByDescig(m=>m.StatisticalDate);//单表查询可以随意排序query.StarSize=20;query.Rows=10;varlst=repository.GetList(query);

2.3分页查询

varstTime=ewDateTime(2019,1,15);varedTime=ewDateTime(2019,2,11);varrepository=RepositoryFactory.Create<ProductSaleByDayEtity>();varquery=QueryFactory.Create<ProductSaleByDayEtity>(m=>m.ShopName.Cotais("测试"));query.Ad(m=>m.StatisticalDate>=stTime);query.Ad(m=>m.StatisticalDate<edTime.Date.AddDays(1));query.OrderByDescig(m=>m.StatisticalDate);//如果是查多个库表必须按分库分表的字段降序排列query.StarSize=20;query.Rows=10;//分库的传入stTime,edTime会自动根据时间查询符合条件的库和表varpagig=repository.GetPagig(query,stTime,edTime);varcout=pagig.TotalCout;varlst=pagig.ToList();//或者pagig.Items

如果可以确定统计时间也可以查指定的库表

varstTime=ewDateTime(2019,1,15);varedTime=ewDateTime(2019,1,18);varrepository=RepositoryFactory.Create<ProductSaleByDayEtity>();varquery=QueryFactory.Create<ProductSaleByDayEtity>(m=>m.ShopName.Cotais("测试"));query.Ad(m=>m.StatisticalDate>=stTime);query.Ad(m=>m.StatisticalDate<edTime.Date.AddDays(1));query.DBModel.DBModel_ShuffledTempDate=ewDateTime(2019,01,01);//这儿表示查19年1月的库和表query.OrderByDescig(m=>m.StatisticalDate);//单表查询可以随意排序query.StarSize=20;query.Rows=10;varpagig=repository.GetPagig(query);varcout=pagig.TotalCout;varlst=pagig.ToList();//或者pagig.Items3.添加varaddEtity=ewProductSaleByDayEtity(){SysNo=Guid.NewGuid(),DataSource="测试来源",ProductID=Guid.NewGuid(),ShopID=Guid.NewGuid(),ShopName="测试店铺",ProductName="测试商品",OutProductID=Guid.NewGuid().ToStrig(),ImportGroupId=Guid.NewGuid(),StatisticalDate=DateTime.Now//分库分表字段是必须的};varrepository=RepositoryFactory.Create<ProductSaleByDayEtity>();//如果新增主键是自增列会自动赋值自增列值到主键repository.Add(addEtity);4.更新

4.1根据主键更新

varupdateEtity=ewProductSaleByDayEtity(){SysNo=Guid.Parse("650BC09C-2B9C-467B-A457-8B4853CC1F0F"),DataSource="测试来源修改",ShopName="店铺修改",StatisticalDate=ewDateTime(2019,01,05),//如果StatisticalDate赋值了则根据StatisticalDate找库表,然后根据主键更新,StatisticalDate也会被更新成所赋的值//如果不想更新StatisticalDate可以用下面这句话//DBModel_ShuffledTempDate=ewDateTime(2019,01,05),//如果不想更新StatisticalDate字段则用这句话来确定是那个库及表};varrepository=RepositoryFactory.Create<ProductSaleByDayEtity>();//根据主键更新其他字段returrepository.Update(updateEtity);

4.2根据where条件更新

varupdateEtity=ewProductSaleByDayEtity(){DataSource="测试来源修改",ShopName="店铺修改Where",DBModel_ShuffledTempDate=ewDateTime(2019,01,05),//如果用这句话来确定是那个库表//StatisticalDate=statisticalDate,//如果要更新StatisticalDate则可以用这句话替代上面那句话};varrepository=RepositoryFactory.Create<ProductSaleByDayEtity>();varwhere=QueryFactory.Create<ProductSaleByDayEtity>(m=>m.ShopName=="测试店铺1"&&m.StatisticalDate>ewDateTime(2019,01,03));//where是更新条件//注意如果是更新用的是实体类的DBModel_ShuffledTempDateQuery中的无效returrepository.Update(updateEtity,where);5.删除

5.1根据主键删除

vardeleteEtity=ewProductSaleByDayEtity(){SysNo=Guid.Parse("650BC09C-2B9C-467B-A457-8B4853CC1F0F"),DBModel_ShuffledTempDate=ewDateTime(2019,01,05),//对于分库分表来说DBModel_ShuffledTempDate是必须的用来确认是那个库表};varrepository=RepositoryFactory.Create<ProductSaleByDayEtity>();returrepository.Delete(deleteEtity);

5.2根据where条件删除

varrepository=RepositoryFactory.Create<ProductSaleByDayEtity>();varwhere=QueryFactory.Create<ProductSaleByDayEtity>();where.DBModel.DBModel_ShuffledTempDate=ewDateTime(2019,01,01);//QueryiSearch方法表示搜索里面空格表示或+表示且//如导入+手工自动+生成表示字段必须同时拥有导入和手工或者自动和生成//生成sql是ad((DataSourcelike'%导入%'adDataSourcelike'%手工%')orDataSourcelike'%自动%'adDataSourcelike'%生成%')where.QueryiSearch(m=>m.DataSource,"新+更");where.QueryiSearch(m=>m.ShopName,"批量修改");//注意如果是更新用的是实体类的DBModel_ShuffledTempDateQuery中的无效returrepository.Delete(where);6.多线程处理

对于mvc每次请求都会在请求结束时将数据库连接关闭,如果是新建线程则需要在线程开始调用DBTool.BegiThread(); 并且在线程结束为止调用DBTool.CloseCoectios();关闭连接

publicclassThreadTool{publicstaticvoidQueueUserWorkItem(Actioactio){ThreadPool.QueueUserWorkItem(delegate{DBTool.BegiThread();try{actio();}fially{DBTool.CloseCoectios();}});}}ThreadTool.QueueUserWorkItem(ThreadDo);//调用7.实体类T4自动生成

在LskyDB.Demo\T4中有可以自动生成实体类的T4模版.其中DbHelper.tticlude中的Cofig是配置数据库的Etity.tt是生成实体的T4模版.大家可以根据自己的情况修改

功能介绍

LnskyDB是基于Dapper的Lambda扩展,支持按时间分库分表,也可以自定义分库分表方法.而且可以T4生成实体类免去手写实体类的烦恼. 在此非常感谢SkyChenSky其中lambda表...

声明:本文仅代表作者观点,不代表本站立场。如果侵犯到您的合法权益,请联系我们删除侵权资源!如果遇到资源链接失效,请您通过评论或工单的方式通知管理员。未经允许,不得转载,本站所有资源文章禁止商业使用运营!
下载安装【程序员客栈】APP
实时对接需求、及时收发消息、丰富的开放项目需求、随时随地查看项目状态

评论