***Loogn.OrmLite — это сверхлегкий, эффективный и гибкий компонент доступа к данным на основе .NET Standard 2.0!***
PM> Install-Package Loogn.OrmLite
using Loogn.OrmLite;
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);
var person = new Person { Name = "loogn" };
var autoId = db.Insert(person, true);
var flag = db.Insert("Person", new { Name = "loogn" });
var autoId = db.Insert("Person", new { Name = "loogn" }, true);
var flag = db.Insert("Person", DictBuilder.Assign("Name", "loogn").Assign("Age", 23));
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'
var list = new List<Person>()
{
new Person { Id = 1, Name = "new name1" },
new Person { Id = 2, Name = "new name2" }
};
var flag = db.UpdateAll(list);
```# Поиск
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
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
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 )