基于Dapper的开源Lambda扩展,且支持分库分表自动生成实体
LnskyDB是基于Dapper的Lambda擴展,支持按時間分庫分表,也可以自定義分庫分表方法
開源地址?https://github.com/liningit/LnskyDB
在此非常感謝SkyChenSky其中lambda表達式的解析參考了他的開源項目
下面是用ProductSaleByDayEntity作為示例,其中StatisticalDate為分庫分表字段,如果是對分庫分表對象進行數據庫操作則必須傳入StatisticalDate或者設置DBModel_ShuffledTempDate指定是那個庫和表
1. 倉儲的創建
倉儲的創建有兩種方式一種是通過RepositoryFactory.Create<ProductSaleByDayEntity>()創建IRepository<ProductSaleByDayEntity>
還有一種是創建一個倉儲類繼承Repository<ProductSaleByDayEntity>
2. 查詢
2.1 根據主鍵查詢
var repository = RepositoryFactory.Create<ProductSaleByDayEntity>();var entity = repository.Get(new ProductSaleByDayEntity
{
DBModel_ShuffledTempDate = new DateTime(2019, 01, 01),
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;
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);
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;
var paging = repository.GetPaging(query, stTime, endTime);
var count = paging.TotalCount;
var lst = paging.ToList();
如果可以確定統計時間也可以查指定的庫表
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);
query.OrderByDescing(m => m.StatisticalDate);
query.StarSize = 20;
query.Rows = 10;
var paging= repository.GetPaging(query);
var count = paging.TotalCount;
var lst = paging.ToList();
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),
};
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),
};
var repository = RepositoryFactory.Create<ProductSaleByDayEntity>();
var where = QueryFactory.Create<ProductSaleByDayEntity>(m => m.ShopName == "測試店鋪1" && m.StatisticalDate > new DateTime(2019, 01, 03));
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),
};
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);
where.QueryiSearch(m => m.DataSource, "新+更");
where.QueryiSearch(m => m.ShopName, "批量修改");
return repository.Delete(where);
6. 多線程處理
對于mvc每次請求都會在請求結束時將數據庫連接關閉,如果是新建線程則需要在線程開始調用DBTool.BeginThread();
并且在線程結束為止調用DBTool.CloseConnections();關閉連接
{
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模版.大家可以根據自己的情況修改
原文地址:https://www.cnblogs.com/liningit/p/11015252.html
.NET社區新聞,深度好文,歡迎訪問公眾號文章匯總?http://www.csharpkit.com?
總結
以上是生活随笔為你收集整理的基于Dapper的开源Lambda扩展,且支持分库分表自动生成实体的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Ocelot(六)- 架构图
- 下一篇: 也读《人月神话》:没有银弹的软件工程