LnskyDB
LnskyDB是基于Dapper的Lambda擴展,支持按時間分庫分表,也可以自定義分庫分表方法.而且可以T4生成物體類免去手寫物體類的煩惱.
檔案地址: https://liningit.github.io/Dapper.LnskyDB/
開源地址: https://github.com/liningit/Dapper.LnskyDB
nuget地址: https://www.nuget.org/packages/LnskyDB/
在此非常感謝SkyChenSky其中lambda運算式的決議參考了他的開源專案
下面是用ProductSaleByDayEntity作為示例,其中StatisticalDate為分庫分表欄位,如果是對分庫分表物件進行資料庫操作則必須傳入StatisticalDate或者設定DBModel_ShuffledTempDate指定是那個庫和表
1. 使用配置
在Startup.cs的ConfigureServices中添加services.AddLnskyDB();在Configure中添加app.UseLnskyDB();
2. 倉儲的創建
倉儲的創建有兩種方式一種是通過RepositoryFactory.Create<ProductSaleByDayEntity>()創建IRepository<ProductSaleByDayEntity>
還有一種是創建一個倉儲類繼承Repository<ProductSaleByDayEntity>
public interface IProductSaleByDayRepository : IRepository<ProductSaleByDayEntity>
{
}
public class ProductSaleByDayRepository : Repository<ProductSaleByDayEntity>
{
}
//呼叫的地方可以
IProductSaleByDayRepository repository=new ProductSaleByDayRepository();
3. 查詢
3.1 根據主鍵查詢
var repository = RepositoryFactory.Create<ProductSaleByDayEntity>();
var entity = repository.Get(new ProductSaleByDayEntity
{
DBModel_ShuffledTempDate = new DateTime(2019, 01, 01),//這兒表示差19年1月的庫和表
SysNo = sysNo
});
3.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);
3.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
4. 添加
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);
5. 更新
5.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);
5.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);
6. 洗掉
6.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);
6.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);
7. 多執行緒處理
對于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);//呼叫
8. 物體類T4自動生成
在LnskyDB.Demo\T4中有可以自動生成物體類的T4模版.
其中DbHelper.ttinclude中的Config是配置資料庫的
Entity.tt是生成物體的T4模版.大家可以根據自己的情況修改
我們專案是表的命名規則是 :非分庫分表的:模塊_表名 分庫分表:模塊_表名_月份 所以T4也是根據這個規則生成的.大家如果不一樣的話可以根據自己的情況修改DbHelper.ttinclude檔案
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/285367.html
標籤:.NET Core
