{"id":19990906,"url":"https://github.com/liningit/Dapper.LnskyDB","last_synced_at":"2025-05-04T10:30:51.395Z","repository":{"id":43469919,"uuid":"191544411","full_name":"liningit/Dapper.LnskyDB","owner":"liningit","description":"基于Dapper的LINQ扩展，支持Lambda表达式，支持按时间分库分表，也可以自定义分库分表方法，且实体类有T4模版自动生成.省去手写实体类的麻烦。已在实际项目使用","archived":false,"fork":false,"pushed_at":"2023-07-22T08:10:09.000Z","size":765,"stargazers_count":243,"open_issues_count":3,"forks_count":59,"subscribers_count":13,"default_branch":"master","last_synced_at":"2025-04-20T00:49:42.819Z","etag":null,"topics":["dapper","dapper-extensions","dapper-lambda","lambda","linq","micro-orm","orm","split-table","table-splitting"],"latest_commit_sha":null,"homepage":"https://www.liningit.com","language":"C#","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/liningit.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null}},"created_at":"2019-06-12T09:52:33.000Z","updated_at":"2025-03-05T13:18:06.000Z","dependencies_parsed_at":"2022-07-26T16:02:27.453Z","dependency_job_id":"8d2a5f82-7700-41c4-9670-0e83299aec35","html_url":"https://github.com/liningit/Dapper.LnskyDB","commit_stats":null,"previous_names":["liningit/lnskydb"],"tags_count":9,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liningit%2FDapper.LnskyDB","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liningit%2FDapper.LnskyDB/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liningit%2FDapper.LnskyDB/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/liningit%2FDapper.LnskyDB/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/liningit","download_url":"https://codeload.github.com/liningit/Dapper.LnskyDB/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":252320000,"owners_count":21729055,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["dapper","dapper-extensions","dapper-lambda","lambda","linq","micro-orm","orm","split-table","table-splitting"],"created_at":"2024-11-13T04:51:31.789Z","updated_at":"2025-05-04T10:30:50.067Z","avatar_url":"https://github.com/liningit.png","language":"C#","readme":"# LnskyDB\n\nLnskyDB是基于Dapper的Lambda扩展,支持按时间分库分表,也可以自定义分库分表方法.而且可以T4生成实体类免去手写实体类的烦恼.\n\n文档地址: https://liningit.github.io/Dapper.LnskyDB/\n\n开源地址: https://github.com/liningit/Dapper.LnskyDB\n\nnuget地址: https://www.nuget.org/packages/LnskyDB/\n\n在此非常感谢SkyChenSky其中lambda表达式的解析参考了他的开源项目\n\n下面是用ProductSaleByDayEntity作为示例,其中StatisticalDate为分库分表字段,如果是对分库分表对象进行数据库操作则必须传入StatisticalDate或者设置DBModel_ShuffledTempDate指定是那个库和表\n\n------------\n#### 1. 使用配置\n在Startup.cs的`ConfigureServices`中添加`services.AddLnskyDB();`在`Configure`中添加`app.UseLnskyDB();`\n#### 2. 仓储的创建\n仓储的创建有两种方式一种是通过`RepositoryFactory.Create\u003cProductSaleByDayEntity\u003e()`创建`IRepository\u003cProductSaleByDayEntity\u003e`\n还有一种是创建一个仓储类继承`Repository\u003cProductSaleByDayEntity\u003e`\n```csharp\npublic interface IProductSaleByDayRepository : IRepository\u003cProductSaleByDayEntity\u003e\n{\n}\npublic class ProductSaleByDayRepository : Repository\u003cProductSaleByDayEntity\u003e\n{\n}\n//调用的地方可以\nIProductSaleByDayRepository repository=new ProductSaleByDayRepository();\n```\n#### 3. 查询\n3.1 根据主键查询\n```csharp\nvar repository = RepositoryFactory.Create\u003cProductSaleByDayEntity\u003e();\nvar entity = repository.Get(new ProductSaleByDayEntity\n{\n    DBModel_ShuffledTempDate = new DateTime(2019, 01, 01),//这儿表示差19年1月的库和表\n    SysNo = sysNo\n});\n```\n3.2 根据where条件查询\n```csharp\nvar stTime = new DateTime(2019, 1, 15);\nvar endTime = new DateTime(2019, 2, 11);\nvar repository = RepositoryFactory.Create\u003cProductSaleByDayEntity\u003e();\nvar query = QueryFactory.Create\u003cProductSaleByDayEntity\u003e(m =\u003e m.ShopName.Contains(\"测试\"));\nquery.And(m =\u003e m.StatisticalDate \u003e= stTime);\nquery.And(m =\u003e m.StatisticalDate \u003c endTime.Date.AddDays(1));\nquery.OrderByDescing(m =\u003e m.StatisticalDate);//如果是查多个库表必须按分库分表的字段降序排列\nquery.StarSize = 20; //可以设置查询行数及开始行数\nquery.Rows = 10;\n//分库的传入stTime,endTime会自动根据时间查询符合条件的库和表\nvar lst = repository.GetList(query, stTime, endTime);\n```\n如果可以确定统计时间也可以查指定的库表进行单表查询\n```csharp\nvar stTime = new DateTime(2019, 1, 15);\nvar endTime = new DateTime(2019, 1, 18);\nvar repository = RepositoryFactory.Create\u003cProductSaleByDayEntity\u003e();\nvar query = QueryFactory.Create\u003cProductSaleByDayEntity\u003e(m =\u003e m.ShopName.Contains(\"测试\"));\nquery.And(m =\u003e m.StatisticalDate \u003e= stTime);\nquery.And(m =\u003e m.StatisticalDate \u003c endTime.Date.AddDays(1));\nquery.DBModel.DBModel_ShuffledTempDate = new DateTime(2019, 01, 01);//这儿表示查19年1月的库和表\nquery.OrderByDescing(m =\u003e m.StatisticalDate);//单表查询可以随意排序\nquery.StarSize = 20;\nquery.Rows = 10;\nvar lst= repository.GetList(query);\n```\n3.3 分页查询\n```csharp\nvar stTime = new DateTime(2019, 1, 15);\nvar endTime = new DateTime(2019, 2, 11);\nvar repository = RepositoryFactory.Create\u003cProductSaleByDayEntity\u003e();\nvar query = QueryFactory.Create\u003cProductSaleByDayEntity\u003e(m =\u003e m.ShopName.Contains(\"测试\"));\nquery.And(m =\u003e m.StatisticalDate \u003e= stTime);\nquery.And(m =\u003e m.StatisticalDate \u003c endTime.Date.AddDays(1));\nquery.OrderByDescing(m =\u003e m.StatisticalDate);//如果是查多个库表必须按分库分表的字段降序排列\nquery.StarSize = 20;\nquery.Rows = 10;\n//分库的传入stTime,endTime会自动根据时间查询符合条件的库和表\nvar paging = repository.GetPaging(query, stTime, endTime);\nvar count = paging.TotalCount;\nvar lst = paging.ToList();//或者paging.Items\n```\n如果可以确定统计时间也可以查指定的库表\n```csharp\nvar stTime = new DateTime(2019, 1, 15);\nvar endTime = new DateTime(2019, 1, 18);\nvar repository = RepositoryFactory.Create\u003cProductSaleByDayEntity\u003e();\nvar query = QueryFactory.Create\u003cProductSaleByDayEntity\u003e(m =\u003e m.ShopName.Contains(\"测试\"));\nquery.And(m =\u003e m.StatisticalDate \u003e= stTime);\nquery.And(m =\u003e m.StatisticalDate \u003c endTime.Date.AddDays(1));\nquery.DBModel.DBModel_ShuffledTempDate = new DateTime(2019, 01, 01);//这儿表示查19年1月的库和表\nquery.OrderByDescing(m =\u003e m.StatisticalDate);//单表查询可以随意排序\nquery.StarSize = 20;\nquery.Rows = 10;\nvar paging= repository.GetPaging(query);\nvar count = paging.TotalCount;\nvar lst = paging.ToList();//或者paging.Items\n```\n#### 4. 添加\n```csharp\nvar addEntity = new ProductSaleByDayEntity()\n{\n    SysNo = Guid.NewGuid(),\n    DataSource = \"测试来源\",\n    ProductID = Guid.NewGuid(),               \n    ShopID = Guid.NewGuid(),\n    ShopName = \"测试店铺\",\n    ProductName = \"测试商品\",\n    OutProductID = Guid.NewGuid().ToString(),\n    ImportGroupId = Guid.NewGuid(),\n    StatisticalDate = DateTime.Now//分库分表字段是必须的\n};\nvar repository = RepositoryFactory.Create\u003cProductSaleByDayEntity\u003e();\n//如果新增主键是自增列会自动赋值自增列值到主键\nrepository.Add(addEntity);\n```\n#### 5. 更新\n5.1 根据主键更新\n```csharp\nvar updateEntity = new ProductSaleByDayEntity()\n{\n    SysNo = Guid.Parse(\"650BC09C-2B9C-467B-A457-8B4853CC1F0F\"),\n    DataSource = \"测试来源修改\",\n    ShopName = \"店铺修改\",\n    StatisticalDate = new DateTime(2019,01,05),//如果StatisticalDate赋值了则根据StatisticalDate找库表,然后根据主键更新,StatisticalDate也会被更新成所赋的值\n    //如果不想更新StatisticalDate可以用下面这句话\n    // DBModel_ShuffledTempDate=new DateTime(2019,01,05),//如果不想更新StatisticalDate字段则用这句话来确定是那个库及表\n};\nvar repository = RepositoryFactory.Create\u003cProductSaleByDayEntity\u003e();\n//根据主键更新其他字段\nreturn repository.Update(updateEntity);\n```\n5.2 根据where条件更新\n```csharp\nvar updateEntity = new ProductSaleByDayEntity()\n{\n    DataSource = \"测试来源修改\",\n    ShopName = \"店铺修改Where\",\n    DBModel_ShuffledTempDate = new DateTime(2019, 01, 05),//如果用这句话来确定是那个库表\n    // StatisticalDate = statisticalDate,//如果要更新StatisticalDate则可以用这句话替代上面那句话\n};\nvar repository = RepositoryFactory.Create\u003cProductSaleByDayEntity\u003e();\nvar where = QueryFactory.Create\u003cProductSaleByDayEntity\u003e(m =\u003e m.ShopName == \"测试店铺1\" \u0026\u0026 m.StatisticalDate \u003e new DateTime(2019, 01, 03));//where是更新条件\n//注意如果是更新用的是实体类的DBModel_ShuffledTempDate Query中的无效\nreturn repository.Update(updateEntity, where);\n```\n#### 6. 删除\n6.1 根据主键删除\n```csharp\nvar deleteEntity = new ProductSaleByDayEntity()\n{\n    SysNo = Guid.Parse(\"650BC09C-2B9C-467B-A457-8B4853CC1F0F\"),\n    DBModel_ShuffledTempDate = new DateTime(2019, 01, 05),//对于分库分表来说DBModel_ShuffledTempDate是必须的用来确认是那个库表\n};\nvar repository = RepositoryFactory.Create\u003cProductSaleByDayEntity\u003e();\nreturn repository.Delete(deleteEntity);\n```\n6.2 根据where条件删除\n```csharp\nvar repository = RepositoryFactory.Create\u003cProductSaleByDayEntity\u003e();\nvar where = QueryFactory.Create\u003cProductSaleByDayEntity\u003e();\nwhere.DBModel.DBModel_ShuffledTempDate = new DateTime(2019, 01, 01);\n//QueryiSearch方法表示搜索里面空格表示或+表示且\n//如 导入+手工 自动+生成 表示字段必须同时拥有导入和手工或者自动和生成\n//生成sql是 and ((DataSource like '%导入%' and DataSource like '%手工%') or DataSource like '%自动%' and DataSource like '%生成%')            \nwhere.QueryiSearch(m =\u003e m.DataSource, \"新+更\");\nwhere.QueryiSearch(m =\u003e m.ShopName, \"批量修改\");\n//注意如果是更新用的是实体类的DBModel_ShuffledTempDate Query中的无效\nreturn repository.Delete(where);\n```\n#### 7. 多线程处理\n对于mvc每次请求都会在请求结束时将数据库连接关闭,如果是新建线程则需要在线程开始调用`DBTool.BeginThread();`\n并且在线程结束为止调用`DBTool.CloseConnections();`关闭连接\n```csharp\npublic class ThreadTool\n{\n    public static void QueueUserWorkItem(Action action)\n    {\n        ThreadPool.QueueUserWorkItem(delegate\n        {\n            DBTool.BeginThread();\n            try\n            {\n                action();\n            }\n            finally\n            {\n                DBTool.CloseConnections();\n            }\n        });\n    }\n}\nThreadTool.QueueUserWorkItem(ThreadDo);//调用\n```\n#### 8. 实体类T4自动生成\n在[LnskyDB.Demo\\T4](https://github.com/liningit/LnskyDB/tree/master/src/LnskyDB.Demo/T4 \"LnskyDB.Demo\\T4\")中有可以自动生成实体类的T4模版.\n其中DbHelper.ttinclude中的Config是配置数据库的\nEntity.tt是生成实体的T4模版.大家可以根据自己的情况修改\n我们项目是表的命名规则是 :非分库分表的:模块_表名 分库分表:模块_表名_月份 所以T4也是根据这个规则生成的.大家如果不一样的话可以根据自己的情况修改`DbHelper.ttinclude`文件\n","funding_links":[],"categories":["C\\#","C# #"],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fliningit%2FDapper.LnskyDB","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fliningit%2FDapper.LnskyDB","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fliningit%2FDapper.LnskyDB/lists"}