LnskyDB
LnskyDB — это расширение Lambda для Dapper, которое поддерживает разделение базы данных и таблицы по времени, а также позволяет настраивать методы разделения. Кроме того, оно может генерировать классы сущностей с помощью T4, избавляя от необходимости вручную создавать классы сущностей.
Адрес документации: https://liningit.github.io/Dapper.LnskyDB/.
Открытый исходный код: https://github.com/liningit/Dapper.LnskyDB.
Доступ через NuGet: https://www.nuget.org/packages/LnskyDB/.
Большое спасибо SkyChenSky за его проект с открытым исходным кодом, который послужил примером для анализа лямбда-выражений.
Ниже приведены примеры использования:
Использование конфигурации
В методе ConfigureServices
класса Startup.cs добавьте services.AddLnskyDB();
в метод Configure
добавьте app.UseLnskyDB();
.
Создание репозитория Существует два способа создания репозиториев:
RepositoryFactory.Create<ProductSaleByDayEntity>()
для создания IRepository<ProductSaleByDayEntity>
.Repository<ProductSaleByDayEntity>
:public interface IProductSaleByDayRepository : IRepository<ProductSaleByDayEntity>
{
}
public class ProductSaleByDayRepository : Repository<ProductSaleByDayEntity>
{
}
// Вызов:
IProductSaleByDayRepository repository = new ProductSaleByDayRepository();
var repository = RepositoryFactory.Create<ProductSaleByDayEntity>();
var entity = repository.Get(new ProductSaleByDayEntity
{
DBModel_ShuffledTempDate = new DateTime(2019, 01, 01), // Это представляет базу данных и таблицу за 19 год, январь
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;
// Поиск по базе данных и таблице на основе времени будет автоматически выполнен с использованием времени запроса
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 год, январь
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;
// Разбиение по страницам на основе времени запроса будет выполнено автоматически
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 год, январь
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
var addEntity = new ProductSaleByDayEntity()
{
SysNo = Guid.NewGuid(),
DataSource = "测试来源",
ProductID = Guid.NewGuid(),
ShopID = Guid.NewGuid(),
ShopName = "测试店铺",
ProductName = "测试商品",
OutProductID = Guid.NewGuid().ToString(),
ImportGroupId = Guid.NewGuid(),
StatisticalDate =
``` **1. Добавление данных**
DateTime.Now//разделитель полей для разделения на таблицы — обязательный }; var repository = RepositoryFactory.Create(); //если первичный ключ — автоинкрементный столбец, то значение будет присвоено автоматически repository.Add(addEntity);
**2. Обновление**
* **2.1. По первичному ключу**
```csharp
var updateEntity = new ProductSaleByDayEntity()
{
SysNo = Guid.Parse("650BC09C-2B9C-467B-A457-8B4853CC1F0F"),
DataSource = "тестовый источник изменен",
ShopName = "магазин изменен",
StatisticalDate = new DateTime(2019, 01, 05), //если StatisticalDate присвоено значение, то поиск по таблице и обновление будут производиться по нему, значение в StatisticalDate также будет обновлено
//если не нужно обновлять StatisticalDate, можно использовать следующую строку:
//DBModel_ShuffledTempDate=new DateTime(2019,01,05)//если не требуется обновлять поле StatisticalDate, используйте эту строку для определения нужной таблицы
};
var repository = RepositoryFactory.Create<ProductSaleByDayEntity>();
//обновление других полей по первичному ключу
return repository.Update(updateEntity);
```
* **2.2. По условию where**
```csharp
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);
```
**3. Удаление**
* **3.1. По первичному ключу**
```csharp
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);
```
* **3.2. По условию where**
```csharp
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);
```
**4. Многопоточная обработка**
Для каждого запроса MVC соединение с базой данных закрывается после завершения запроса. Если создаётся новый поток, необходимо вызвать `DBTool.BeginThread();` в начале потока и `DBTool.CloseConnections();` для закрытия соединения до завершения потока.
```csharp
public class ThreadTool
{
public static void QueueUserWorkItem(Action action)
{
ThreadPool.QueueUserWorkItem(delegate
{
DBTool.BeginThread();
try
{
action();
}
finally
{
DBTool.CloseConnections();
}
});
}
}
ThreadTool.QueueUserWorkItem(ThreadDo);//вызов
5. Автоматическое создание сущностей T4
В LnskyDB.Demo\T4 есть возможность автоматического создания сущностей с помощью T4.
Конфигурационный файл DbHelper.ttinclude
содержит настройки базы данных. Файл Entity.tt
— это шаблон T4 для генерации сущностей. Пользователи могут изменять его в соответствии со своими потребностями. В нашем проекте правило именования таблиц следующее: неразделяемые таблицы: модуль_имя таблицы
, разделяемые таблицы: модуль_имя таблицы_месяц
. Поэтому шаблон T4 генерирует сущности в соответствии с этим правилом. Пользователи, у которых правила отличаются, могут изменить файл DbHelper.ttinclude
.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )