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

OSCHINA-MIRROR/loogn-Loogn.OrmLite

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

Краткое описание

***Loogn.OrmLite — это сверхлегкий, эффективный и гибкий компонент доступа к данным на основе .NET Standard 2.0!***

Основные характеристики

  1. Поддержка баз данных SQL Server, MySQL и SQLite;
  2. Расширение методов расширения IDbConnection и IDbTransaction;
  3. Поддержка транзакций баз данных и массового внесения данных;
  4. Поддержка моделей типа dynamic (можно использовать ORM даже без определения модели);
  5. Высочайшая производительность и минимальный размер библиотеки, быстрее Dapper и меньше по размеру, Loogn.OrmLite.dll всего 85КБ.

Начало работы

Шаг 1. Установка Loogn.OrmLite

PM> Install-Package Loogn.OrmLite

Шаг 2. Включение пространства имён

using Loogn.OrmLite;

Шаг 3. Пример использования

using (var db = new SqlConnection("server=. ;uid=sa;pwd=sa;database=test"))
{
    var flag = db.Insert(new Person { Id = 23 });
    if (flag > 0)
    {
        var person = db.SingleById<Person>(23);
    }
}

Обычно создание объекта соединения можно вынести в отдельный метод:

public static class DB
{
    public static IDbConnection Open()
    {
        return new SqlConnection("server=. ;uid=sa;pwd=sa;database=test");
    }
}

Использование становится ещё проще:

using (var db = DB.Open())
{
    // работа с db
}
```## Ленивый подход
В ORM существует абстрактный класс `AbstractDao`, который можно расширять в конкретных проектах, предоставляя строку подключения как базовый класс слоя DAO:
```csharp
public class BaseDao<TEntity> : AbstractDao<TEntity>
{
    protected override IDbConnection Open()
    {
        return new SqlConnection(ConnectionStringsSection.Instance.Db2);
    }
}

Для создания DAO-класса практически нет необходимости писать код:

public class OrderDao : BaseDao<Order>
{
    // Здесь можно добавить специфичные методы DAO, но обычно этого не требуется
}
```## Модели
 Пример чистой модели:
```csharp
public class Person
{
    public int Id { get; set; }
    public string Name { get; set; }
    public DateTime UpdateTime { get; set; }
}

Модель с атрибутами

// Указание имени таблицы
[OrmLiteTable("t_person")]
public class Person
{
    // При полной модификации используется первичный ключ, если он автоинкрементируемый, можно использовать InsertIgnore для игнорирования при вставке
    [OrmLiteField(IsPrimaryKey = true, InsertIgnore = true)]
    public int Id { get; set; }
    public string Name { get; set; }
    public DateTime UpdateTime { get; set; }
    // При полной модификации игнорируется
    [OrmLiteField(UpdateIgnore = true)]
    public DateTime AddTime { get; set; }
    // При полной модификации и добавлении игнорируется
    [OrmLiteField(Ignore = true)]
    public List<string> SomeAttrs { get; set; }
}

Вставка

  • Вставка модели, возврат количества затронутых строк
var person = new Person { Name = "loogn" };
var flag = db.Insert(person);
  • Вставка модели, возврат значения автоинкремента (long)
var person = new Person { Name = "loogn" };
var autoId = db.Insert(person, true);
  • Вставка анонимного объекта, возврат количества затронутых строк
var flag = db.Insert("Person", new { Name = "loogn" });
  • Вставка анонимного объекта, возврат значения автоинкремента (long)
var autoId = db.Insert("Person", new { Name = "loogn" }, true);
  • Вставка словаря, возврат количества затронутых строк
var flag = db.Insert("Person", DictBuilder.Assign("Name", "loogn").Assign("Age", 23));
  • Вставка словаря, возврат значения автоинкремента (long)
var autoId = db.Insert("Person", DictBuilder.Assign("Name", "loogn").Assign("Age", 23), true);
```> DictBuilder генерирует подкласс `Dictionary<string, object>`
 - Батч-вставка моделей
```csharp
var list = new List<Person>()
{
    new Person { Name = "p1" },
    new Person { Name = "p2" }
};
var boolFlag = db.InsertAll(list);
  • Батч-вставка анонимных объектов
var list = new List<object>()
{
    new { Name = "p1" },
    new { Name = "p2" }
};
var boolFlag = db.InsertAll("Person", list);
```## Обновление
 - Обновление модели по первичному ключу, возврат количества затронутых строк
 ```csharp
 var person = new Person { Id = 23, Name = "update name", Age = 28 };
 var flag = db.Update(person);
 // или указание конкретных столбцов для обновления
 var flag = db.Update(person, "Name", "Age");
  • По условию изменение указанных столбцов
      var fields = DictBuilder.Assign("name", "updateName").Assign("$age", "age+1");
      var ps = DictBuilder.Assign("id", 23);
      var flag = db.Update<Person>(fields, "id=@id", ps);
      //или
      var flag = db.Update("person", fields, "id=@id", ps);

    В fields список $age означает, что значение не параметризировано и используется как есть, в данном случае будет сгенерирован запрос UPDATE person SET name=@name, age=age+1 WHERE id=23

  • Изменение указанного столбца по первичному ключу
      var fields = DictBuilder.Assign("name", "updateName").Assign("$age", "age+1");
      var flag = db.UpdateById<Person>(fields, 23);
      //или
      var flag = db.UpdateById("person", fields, 23);
  • Изменение указанного столбца по значению другого столбца
      var fields = DictBuilder.Assign("name", "updateName").Assign("$age", "age+1");
      var flag = db.UpdateById<Person>(fields, "loogn", "Name");
      //или
      var flag = db.UpdateById("person", fields, "loogn", "Name");
  • Изменение одного столбца по первичному ключу
      var flag = db.UpdateFieldById<Person>("name", "update name", 1);
      //UPDATE person SET name=@name WHERE id=1; @name='update name'
  • Изменение одного столбца по значению другого столбца
      var flag = db.UpdateFieldById<Person>("name", "update name", 23, "age");
      //UPDATE person SET name=@name WHERE age=23; @name='update name'
  • Обновление модели с использованием анонимного объекта, таблица и анонимный объект должны содержать колонку ID ```csharp var flag = db.UpdateAnonymous("person", new { Name = "new name", Id = 2 }); //или var flag = db.UpdateAnonymous(new { Name = "new name", Id = 2 }); //UPDATE person SET Name='new name' WHERE Id=2;
    
    
  • Батч-обновление моделей
      var list = new List<Person>()
      {
          new Person { Id = 1, Name = "new name1" },
          new Person { Id = 2, Name = "new name2" }
      };
      var flag = db.UpdateAll(list);
    ```# Поиск
  • Поиск одной записи по ID
      var person = db.SingleById<Person>(1);
      // или
      var person = db.SingleById<Person>(1, "_id");
  • Поиск одной записи по условиям
      var person = db.Single<Person>("age>10 and sex=1");
      // SELECT * FROM person WHERE age>10 AND sex=1
      var person = db.Single<Person>("age>10 AND Name=@name", DictBuilder.Assign("name", "abc"));
      // SELECT * FROM person WHERE age>10 AND Name=@name; @name='abc'

Пример использования различных методов запроса:

Single<Person>("select ID,Name from Person where age>10 and sex=1");
// Оригинальный SQL-запрос
var person = db.Single<Person>("select ID,Name from Person where age>10 and name=@name", DictBuilder.Assign("name", "abc"));
// Оригинальный SQL-запрос с параметрами

// Параметризованный запрос
```csharp
var person = db.SingleFmt<Person>("select ID,Name from Person where age>{0} and sex={1}", 10, 1);

// Поиск одной записи по одному условию

var person = db.SingleWhere<Person>("id", 23);

// Поиск одной записи с использованием словаря условий

var person = db.SingleWhere<Person>(DictBuilder.Assign("name", "loogn").Assign("age", 23));

// Поиск одной записи с использованием анонимного объекта как условия

var person = db.SingleWhere<Person>(new { Name = "loogn", Age = 23 });

// Получение всех записей

var list = db.Select<Person>();

// Запрос с оператором IN

var list = db.SelectByIds<Person>(new int[] { 1, 2, 3 });
// select * from person where id in (1,2,3);
var list = db.SelectByIds<Person>(new string[] { "1", "2", "3" }, "userId");
// select * from person where userId in ("1","2","3");
var list = db.SelectByIds<Person>(new string[] { "1", "2", "3" }, "userId", "id,name");
// select id,name from person where userId in ("1","2","3");
```// Возврат нескольких наборов результатов
```csharp
var cmds = new MutipleCmd[]{
    new MutipleCmd{CmdText="select * from person"},
    new MutipleCmd{CmdText="select count(*) from person where id=@id",Params=DictBuilder.Assign("id",23)},
    new MutipleCmd{CmdText="select top 1 * from User where age>23"}
};
using(var fetcher = db.SelectMutipleResult(cmds)){
    var personList = fetcher.FetchList<Person>();   // Соответствует первой команде
    var personCount = fetcher.FetchScalar<int>();   // Соответствует второй команде
    var user = fetcher.FetchObject<User>();         // Соответствует третьей команде
}

Другие методы Select и Single аналогичны.// Пагинация

var pageResult = db.SelectPage<Person>(new OrmLitePageFactor {
    Conditions = "id > 2 and age = @age",
    Fields = "ID, Name",
    OrderBy = "ID DESC",
    PageIndex = 1,
    PageSize = 10,
    Params = DictBuilder.Assign("age", 23)
});
// Также можно использовать соединение запросов
var pageResult = db.SelectPage<Person>(new OrmLitePageFactor {
- Количество записей
```csharp
long count = db.Count<Person>();
// SELECT COUNT(*) FROM Person;
long count = db.Count<Person>("id > @id", DictBuilder.Assign("id", 1));
long count = db.Count<Person>("id > @id", new { id = 1 });
// SELECT COUNT(*) FROM person WHERE id = @id; @id = 1
long count = db.CountWhere<Person>("age", 1);
// SELECT COUNT(*) FROM Person WHERE age = @age; @age = 1
long count = db.CountWhere<Person>(DictBuilder.Assign("age", 23).Assign("name", "loogn"));
long count = db.CountWhere<Person>(new { age = 23, name = "loogn" });
// SELECT COUNT(*) FROM person WHERE age = @age AND name = @name; @age = 23, @name = "loogn";
  • Наибольшее значение
long maxId = db.MaxID<long>("person");
// SELECT MAX(id) FROM person 
string maxUserId = db.MaxID<string>("person", "userid");
// SELECT MAX(userid) FROM person 
  • Первое значение из выборки (Scalar)
int id = db.Scalar<int>("SELECT id FROM Person WHERE id = 23");
string name = db.Scalar<string>("SELECT name FROM Person WHERE age > @age", new { age = 23 });
  • Выборка одного поля (значение)
List<string> nameList = db.Column<string>("SELECT name FROM person WHERE age > @age", DictBuilder.Assign("age", 23));
HashSet<string> nameSet = db.ColumnDistinct<string>("SELECT DISTINCT(name) FROM person");
  • Выборка значений в виде словаря (значение)
Dictionary<int, string> typeDict = db.Dictionary<int, string>("SELECT id, name FROM Type");
// id и name соответствуют друг другу
  • Выборка значений один ко многим (значение)
Dictionary<int, List<string>> lookup = db.Lookup<int, string>("SELECT userid, tagName FROM userTag");
// Один userid соответствует нескольким tagName

Удаление

  • Удаление по id
var flag = db.DeleteById<Person>(2);
``````markdown
## Удаление по ключу
```csharp
    var flag = db.DeleteByIds<Person>(new string[] {"111", "222", "333"}, "userId");
    // DELETE FROM person WHERE userId IN ('111', '222', '333')
    var flag = db.DeleteWhere<Person>("name", "loogn");
    // DELETE FROM person WHERE name=@name; @name='loogn'
    var flag = db.DeleteWhere<Person>(DictBuilder.Assign("age", 23).Assign("name", "loogn"));
    var flag = db.DeleteWhere<Person>(new { age = 23, name = "loogn" });
    // DELETE FROM person WHERE age=@age AND name=@name; @age=23, @name='loogn';

Удаление по условию

    var flag = db.Delete("DELETE FROM person WHERE id=@id", DictBuilder.Assign("id", 23));
    var flag = db.Delete<Person>();
    // DELETE FROM person;

Другое

  • Выполнение хранимых процедур
    db.Proc("sp_name", DictBuilder.Assign("p1", 21).Assign("p2", "p2 value"), true);
    // Прямое выполнение
    var cmd = db.Proc("sp_name", DictBuilder.Assign("p1", 21).Assign("p2", "p2 value"));
    // Возвращает cmd, дальнейшая обработка результата производится самостоятельно,
    // если есть выходные параметры, они могут быть добавлены в cmd здесь
    using(var reader = cmd.ExecuteReader())
    {
        var list = TransformForDataReader.ReaderToObjectList<Person>(reader);
        // Класс TransformForDataReader предоставляет множество методов для чтения данных из reader
    }
  • Шаблон транзакций
    using(var db = DB.Open())
    {
        db.EnsureOpen();
        var trans = db.BeginTransaction();
        try
        {
            var flag1 = trans.Update(new Person { Id = 1, Name = "loogn2" });
            var flag2 = trans.Insert(new Person { Id = 2, Name = "loogn1" });
            if(flag1 > 0 && flag2 > 0)
            {
                trans.Commit();
            }
            else
            {
                trans.Rollback();
            }
        }
        catch(Exception exp)
        {
            trans.Rollbak();
        }
    }
Rollback();
         }
     }
 ```
> Используйте метод `BeginTransaction` объекта соединения для получения объекта транзакции, затем выполняйте методы на этом объекте транзакции;
> Объект транзакции имеет те же методы, что и объект соединения;
- ```csharp
using(var db = new MySqlConnection("server=.;uid=root;pwd=root;database=test"))
{
    // делайте то, что вам нравится...
}
```
- Глобальная конфигурация
Атрибут `OrmLite.DefaultKeyName` используется для настройки имени по умолчанию для первичного ключа, по умолчанию это `"Id"`;

Обновление свойства `UpdateIgnoreFields` для глобальной конфигурации, игнорируемых полей при общем обновлении по умолчанию составляет: `["AddTime", "AddDate"]`. Это значение можно изменять в зависимости от проекта.
```

Комментарии ( 0 )

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

Введение

Описание недоступно Развернуть Свернуть
MIT
Отмена

Обновления

Пока нет обновлений

Участники

все

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

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