Dkd.Infra.Filter
1.9.0
dotnet add package Dkd.Infra.Filter --version 1.9.0
NuGet\Install-Package Dkd.Infra.Filter -Version 1.9.0
<PackageReference Include="Dkd.Infra.Filter" Version="1.9.0" />
<PackageVersion Include="Dkd.Infra.Filter" Version="1.9.0" />
<PackageReference Include="Dkd.Infra.Filter" />
paket add Dkd.Infra.Filter --version 1.9.0
#r "nuget: Dkd.Infra.Filter, 1.9.0"
#:package Dkd.Infra.Filter@1.9.0
#addin nuget:?package=Dkd.Infra.Filter&version=1.9.0
#tool nuget:?package=Dkd.Infra.Filter&version=1.9.0
Dkd.Infra.Filter
پکیج فیلتر پویای JSON — تبدیل فیلترهای پیچیدهی JSON (خروجی کتابخانهی فرانتاند) به Expression و اعمال آنها روی IQueryable قبل از صفحهبندی (Paging). پشتیبانی از عملگرهای متنوع، گروههای تو در تو (AND/OR) و اعتبارسنجی امنیتی فیلدها.
- TargetFramework: net8.0
- نسخهی فعلی: 1.8.1
- لایسنس: MIT
- Namespace اصلی:
Dkd.Infra.Filter
معرفی
این پکیج برای صفحهبندیهای پویا (Dynamic Paging) طراحی شده است؛ جایی که کاربر فرانتاند میخواهد فیلترهای دلخواه بسازد. قرارداد JSON دقیقاً همان خروجی پکیج فرانتاند @dkd/filter (UniversalFilter) است.
مزایا:
- قدرتمندی: عملگرهای
contains،between،>،<،isemptyو … - گروهبندی: گروههای تو در تو با
AND/OR(بازگشتی). - امنیت: امکان محدودکردن فیلدهای مجاز (
allowedFields). - سادگی: با یک متد
ApplyJsonFilterهمهچیز انجام میشود.
امکانات اصلی
- اعتبارسنجی JSON فیلتر با
FilterJsonValidator(ساختار، عملگرها و مقادیر). - ساخت Expression با
FilterExpressionBuilder(با Reflection و تبدیل خودکار نوع). - اعمال روی
IQueryableباQueryableFilterExtensions(ApplyJsonFilter/ApplyFilter). - پشتیبانی از مسیر نقطهای (
a.b.c) برای پراپرتیهای تو در تو. - خطای فارسی با
BusinessException(HTTP 400) هنگام ورودی نامعتبر. - فیلتر خالی/null: بدون تغییر کوئری.
قرارداد JSON
{
"combinator": "AND",
"rules": [
{ "field": "name", "operator": "contains", "value": "علی" },
{ "field": "salary", "operator": "between", "value": 2000, "valueTo": 4000 },
{ "combinator": "OR", "rules": [ { "field": "status", "operator": "=", "value": true } ] }
]
}
| بخش | توضیح |
|---|---|
combinator |
AND یا OR |
rules |
آرایهای از «شرط ساده» یا «گروه تو در تو» |
field |
نام/مسیر پراپرتی موجودیت (مسیر نقطهای a.b.c پشتیبانی میشود) |
operator |
contains beginsWith endsWith = != < > <= >= between isempty isnotempty |
value / valueTo |
مقدار (عدد، رشته، بولی، تاریخ ISO) — valueTo فقط برای between |
سمانتیک تاریخ بر اساس «روز» است (مطابق فرانتاند): = → بازه [روز, روز+۱) | < → قبل از روز | > → از روز بعد | between → [از, تا+۱).
ساختار پروژه
Dkd.Infra.Filter/
├── FilterOperator.cs # enum عملگرها + Parse از رشته JSON
├── Dtos/FilterGroupDto.cs # قرارداد JSON (گروه + آیتم بازگشتی)
├── Validation/FilterJsonValidator.cs # اعتبارسنجی ساختار، عملگر و مقادیر
├── Expressions/FilterExpressionBuilder.cs # ساخت Expression tree
└── Extensions/QueryableFilterExtensions.cs # ApplyJsonFilter / ApplyFilter
کلاسهای کلیدی
| نام | توضیح |
|---|---|
FilterGroupDto |
قرارداد JSON گروه فیلتر (بازگشتی). |
FilterOperator |
عملگرهای پشتیبانیشده و Parse آنها. |
FilterJsonValidator |
اعتبارسنجی ساختار، عملگرها و مقادیر قبل از ساخت Expression. |
FilterExpressionBuilder |
ساخت Expression<Func<T, bool>> با Reflection و تبدیل خودکار نوع. |
QueryableFilterExtensions |
متدهای ApplyJsonFilter و ApplyFilter روی IQueryable<T>. |
روش استفاده
using Dkd.Infra.Filter.Extensions;
public async Task<ServiceResult<PageModelDto<UserDto>>> GetPagedAsync(
UserSearchPagedDto search, CancellationToken ct = default)
{
var query = _db.Users.AsNoTracking()
.ApplyJsonFilter(search.Filter); // اعتبارسنجی + اعمال فیلتر
var total = await query.CountAsync(ct);
var items = await query
.OrderBy(x => x.Id)
.Skip(search.SkipRows())
.Take(search.PageSize)
.ToListAsync(ct);
return ServiceResult(new PageModelDto<UserDto>(search.PageIndex, search.PageSize, total, items));
}
محدود کردن فیلدهای مجاز (اختیاری — امنیت):
query.ApplyJsonFilter(search.Filter, allowedFields: ["id", "name", "account", "status"]);
وابستگیها
Dkd.Infra.Core(برایBusinessExceptionوJsonHelper)System.Text.Json- بدون پکیج خارجی جدید.
اطلاعات تکمیلی
- ورژن:
1.8.1 - پیشوند پکیج:
Dkd.Infra
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net8.0
- Dkd.Infra.Core (>= 1.9.0)
- System.Text.Json (>= 8.0.5)
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.