1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/lining_it-LnskyDB

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

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 за его проект с открытым исходным кодом, который послужил примером для анализа лямбда-выражений.

Ниже приведены примеры использования:

  1. Использование конфигурации В методе ConfigureServices класса Startup.cs добавьте 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();
  1. Запрос 3.1 Поиск по первичному ключу
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
  1. Добавление
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 )

Вы можете оставить комментарий после Вход в систему

Введение

На основе расширения Lambda для Dapper поддерживается разделение по времени и схеме, также можно настроить собственный метод разделения по схеме и таблице. Для сущностей есть автоматическое создание с использованием шаблонов T4. Это избавляет от необходимости вручную писать классы сущностей. Развернуть Свернуть
MIT
Отмена

Обновления (1)

все

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/lining_it-LnskyDB.git
git@api.gitlife.ru:oschina-mirror/lining_it-LnskyDB.git
oschina-mirror
lining_it-LnskyDB
lining_it-LnskyDB
master