commit deb62615f5c28b1501e8513e33bd3019317c1e9f
parent 46a1e300d4125833cc61a700904cd7347f8646c0
Author: novickii.sergei.nure@gmail.com <novickii.sergei.nure@gmail.com>
Date: Fri, 26 Apr 2024 19:04:26 +0300
Fix readme 3
Diffstat:
| M | README.md | | | 137 | ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----------- |
1 file changed, 119 insertions(+), 18 deletions(-)
diff --git a/README.md b/README.md
@@ -1,4 +1,112 @@
# QueryExpressionBuilder
+Library for generating predicate functions for filtering database queries.
+
+## Description
+This library helps create a predicate function for filtering database queries based on a model.
+
+## Instruction
+To use the library, you need to create a model with properties for filtering. Properties in the model need to be marked with attributes.<br>
+
+Currently, there are 3 attributes:<br>
+
+Namespace QueryExpressionBuilder.Attributes.String - attributes for properties of type String<br>
+StartWithAttribute - Indicates that a filter equivalent to the System.String.StartWith() function will be used for the property.<br>
+
+Namespace QueryExpressionBuilder.Attributes.Numbers - attribute for all properties that are numeric, including DateTime<br>
+GreaterOrEqualAttribute - Indicates that a filter equivalent to the >= conditional expression will be used for the property.<br>
+LessOrEqualAttribute - Indicates that a filter equivalent to the <= conditional expression will be used for the property.<br>
+
+You need to pass the property name from the class representing the entity in the database to the attribute constructor.
+
+## Examples
+Suppose we have an entity User, which is an entity in the database.
+```csharp
+ public class User : IEntity
+ {
+ public Guid Id { get; set; }
+ public string Name { get; set; }
+ public string Surname { get; set; }
+ public string Email { get; set; }
+ public DateTime BirthDate { get; set; }
+ public DateTime RegistrationDate { get; set; }
+ public string PasswodHash { get; set; }
+ public float Amount { get; set; }
+ }
+```
+To create a Query filter, we need to create a query model.
+```csharp
+ public class UserQuery
+ {
+ [QueryExpressionBuilder.Attributes.String.StartWith("Name")]
+ public string? Name { get; set; }
+
+ [QueryExpressionBuilder.Attributes.String.StartWith("Surname")]
+ public string? Surname { get; set; }
+
+ [QueryExpressionBuilder.Attributes.String.StartWith("Email")]
+ public string? Email { get; set; }
+
+ [QueryExpressionBuilder.Attributes.Numbers.GreaterOrEqual("BirthDate")]
+ public DateTime? FromBirthDate { get; set; }
+
+ [QueryExpressionBuilder.Attributes.Numbers.LessOrEqual("BirthDate")]
+ public DateTime? ToBirthDate { get; set; }
+
+ [QueryExpressionBuilder.Attributes.Numbers.GreaterOrEqual("RegistrationDate")]
+ public DateTime? FromRegistrationDate { get; set; }
+
+ [QueryExpressionBuilder.Attributes.Numbers.LessOrEqual("RegistrationDate")]
+ public DateTime? ToRegistrationDate { get; set; }
+
+ [QueryExpressionBuilder.Attributes.Numbers.GreaterOrEqual("Amount")]
+ public float? FromAmount { get; set; }
+
+ [QueryExpressionBuilder.Attributes.Numbers.LessOrEqual("Amount")]
+ public float? ToAmount { get; set; }
+ }
+```
+And now, in the controller method, which represents the endpoint, simply pass the UserQuery object to the ExpressionBuilder class, which will return the predicate function.
+```csharp
+ [ApiController]
+ [Route("[controller]")]
+ public class WeatherForecastController : ControllerBase
+ {
+ private readonly ILogger<WeatherForecastController> _logger;
+ private readonly IUserService userService;
+
+ public WeatherForecastController(ILogger<WeatherForecastController> logger, IUserService _userService)
+ {
+ userService = _userService;
+ _logger = logger;
+ }
+
+ /// <summary>
+ /// Метод получения юзеров
+ /// </summary>
+ /// <param name="queryParams">Объект содержащий параметры фильтрации</param>
+ /// <returns>Возвращает список юзеров</returns>
+ [HttpGet("[controller]/GetUsers")]
+ public async Task<IEnumerable<User>> GetUsers([FromQuery] UserQuery queryParams)
+ {
+ //Генерируем предикат на основе параметров
+ var predicate = ExpressionBuilder.GetPredicate<User, UserQuery>(queryParams);
+ //Передаем предикат в сервис и возвращаем результат
+ var result = await userService.GetUsers(predicate);
+ return result;
+ }
+ }
+```
+Now, when sending a request to the database<br>
+https://localhost:7001/GetUsers?Name=M&FromBirthDate=2000-01-01&ToBirthDate=2040-01-01&FromAmount=1000<br>
+We get an SQL query.
+```sql
+SELECT "u"."Id", "u"."Amount", "u"."BirthDate", "u"."Email", "u"."Name", "u"."PasswodHash", "u"."RegistrationDate", "u"."Surname"
+ FROM "Users" AS "u"
+ WHERE instr("u"."Name", 'M') > 0 AND "u"."BirthDate" >= '2000-01-01 00:00:00' AND "u"."BirthDate" <= '2040-01-01 00:00:00' AND "u"."Amount" >= 1000
+```
+<br><br><br>
+
+# QueryExpressionBuilder
Библиотека для генирации функций-предикатов для фильтрирования запросов в БД.
## Описание
@@ -6,18 +114,18 @@
## Инструкция
Для работы библиотеки необходимо создать модель с свойствами для фильтрации.<br>
-Свойства в модели необходимо пометить атрибутами.<br><br>
+Свойства в модели необходимо пометить атрибутами.<br>
-На данный момент существует 3 атрибута:<br><br>
+На данный момент существует 3 атрибута:<br>
Пространство имен QueryExpressionBuilder.Attributes.String - атрибуты для свойств типа String<br>
-StartWithAttribute - Означает, что дял свойства будет использоватся фильтр с аналогом функции System.String.StartWith()<br><br>
+StartWithAttribute - Означает, что дял свойства будет использоватся фильтр с аналогом функции System.String.StartWith()<br>
Пространство имен QueryExpressionBuilder.Attributes.Numbers - атрибут для всех свойств которые ввляются числовыми, в том числе DateTime<br>
GreaterOrEqualAttribute - Означает, что для свойства будет использоваться фильтр с аналогом условного выражения >=<br>
LessOrEqualAttribute - Означает, что для свойства будет использоваться фильтр с аналогом условного выражения <=<br>
-В конструктор атрибута необходимо передать название свойства из класса представляющий сущьность в БД.<br><br>
+В конструктор атрибута необходимо передать название свойства из класса представляющий сущьность в БД.<br>
## Примеры
Предположим у нас есть сущьность User, которая являеться сущьностью в БД.
@@ -31,7 +139,6 @@ LessOrEqualAttribute - Означает, что для свойства буде
public DateTime BirthDate { get; set; }
public DateTime RegistrationDate { get; set; }
public string PasswodHash { get; set; }
- public int Age { get; set; }
public float Amount { get; set; }
}
```
@@ -40,13 +147,13 @@ LessOrEqualAttribute - Означает, что для свойства буде
public class UserQuery
{
[QueryExpressionBuilder.Attributes.String.StartWith("Name")]
- public string Name { get; set; }
+ public string? Name { get; set; }
[QueryExpressionBuilder.Attributes.String.StartWith("Surname")]
- public string Surname { get; set; }
+ public string? Surname { get; set; }
[QueryExpressionBuilder.Attributes.String.StartWith("Email")]
- public string Email { get; set; }
+ public string? Email { get; set; }
[QueryExpressionBuilder.Attributes.Numbers.GreaterOrEqual("BirthDate")]
public DateTime? FromBirthDate { get; set; }
@@ -60,12 +167,6 @@ LessOrEqualAttribute - Означает, что для свойства буде
[QueryExpressionBuilder.Attributes.Numbers.LessOrEqual("RegistrationDate")]
public DateTime? ToRegistrationDate { get; set; }
- [QueryExpressionBuilder.Attributes.Numbers.GreaterOrEqual("Age")]
- public int? FromAge { get; set; }
-
- [QueryExpressionBuilder.Attributes.Numbers.LessOrEqual("Age")]
- public int? ToAge { get; set; }
-
[QueryExpressionBuilder.Attributes.Numbers.GreaterOrEqual("Amount")]
public float? FromAmount { get; set; }
@@ -105,10 +206,10 @@ LessOrEqualAttribute - Означает, что для свойства буде
}
```
Теперь отправляя запрос<br>
-https://localhost:7001/GetUsers?Name=S&FromBirthDate=2010-01-01&ToBirthDate=2040-01-01&FromAge=20<br>
-в БД мы получаес SQL запрос
+https://localhost:7001/GetUsers?Name=M&FromBirthDate=2000-01-01&ToBirthDate=2040-01-01&FromAmount=1000<br>
+в БД мы получаем SQL запрос
```sql
-SELECT "u"."Id", "u"."Age", "u"."Amount", "u"."BirthDate", "u"."Email", "u"."Name", "u"."PasswodHash", "u"."RegistrationDate", "u"."Surname"
+SELECT "u"."Id", "u"."Amount", "u"."BirthDate", "u"."Email", "u"."Name", "u"."PasswodHash", "u"."RegistrationDate", "u"."Surname"
FROM "Users" AS "u"
- WHERE instr("u"."Name", 'S') > 0 AND "u"."BirthDate" >= '2010-01-01 00:00:00' AND "u"."BirthDate" <= '2040-01-01 00:00:00' AND "u"."Age" >= 20
+ WHERE instr("u"."Name", 'M') > 0 AND "u"."BirthDate" >= '2000-01-01 00:00:00' AND "u"."BirthDate" <= '2040-01-01 00:00:00' AND "u"."Amount" >= 1000
```
\ No newline at end of file