QueryExpressionBuilder

Library for building Predicate Expression from query models
git clone git://185.198.27.126/QueryExpressionBuilder.git
Log | Files | Refs | README

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:
MREADME.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