بخش دوم - بررسی امکانات (کلاس ها و متدهای) کتابخانه Gridify
نویسنده: علیرضا صبوری
تاریخ: ۱۴۰۰/۰۴/۳۰ ۱۹:۵
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
Filter = "Name==Ali,Age>>10";
SortBy = "Age";
| ApplyFiltering | از این متد برای اعمال فیلترینگ روی یک IQueryable استفاده میشود. این متد یک رشته متنی (string) ویا یک GridifyQuery دریافت کرده و پس از اعمال فیلترینگ یک IQueryable بازمیگرداند. |
| ApplyOrdering | از این متد برای اعمال چیدمان یا Sorting روی یک IQueryable استفاده میشود. پس از اعمال چیدمان، یک IQueryable را بازمیگرداند. |
| ApplyPaging | از این متد برای اعمال صفحه بندی (Pagination) استفاده میشود. پس از اعمال صفحه بندی یک IQueryable را بازمیگرداند. |
| ApplyOrderingAndPaging | از این متد برای اعمال همزمان چیدمان و صفحه بندی استفاده میشود که یک IQueryable را باز میگرداند. |
| ApplyFilterAndOrdering | از این متد برای اعمال همزمان فیلترینگ و چیدمان استفاده میشود که یک IQueryalbe را باز میگرداند. |
| ApplyEverything | از این متد برای اعمال عملیات صفحه بندی، چیدمان و فیلترینگ استفاده میشود که یک IQueryable را باز میگرداند. |
| GridifyQueryable | این متد مشابه ApplyEverything است که مقدار یک <QueryablePaging<T را برمیگرداند و دارای یک خصیصه اضافی TotalItems است که در عملیات صفحه بندی عموما نیاز داریم. (تعداد کل رکوردهای موجود در پایگاه داده، با توجه به فیلتر اعمال شده) |
| Gridify | متدهای قبلی فقط به query موجود ما یکسری شرط را اضافه میکردند. ولی مسئولیت اجرای query به عهده ما بود. (مثلا با استفاده از ToList.). متد Gridify تمامی شرطها را باتوجه به GridifyQuery دریافتی اعمال کرده، سپس اطلاعات را بارگذاری کرده و یک <Paging<T را بازمیگرداند که کاملا قابل استفاده و بهینه شده برای دیتاگریدها میباشد. |
| | |
| GetFilteringExpression | این متد expression معادل فیلتر string نوشته شده شما را برمیگرداند که میتوانید از آن به طور مثال در متد Where در Linq استفاده نمایید. |
| GetOrderingExpression | این متد expression انتخاب فیلد برای Orderby و OrderByDescending را باتوجه به مقدار وارد شده در فیلد SortBy بازمیگرداند. |
همانطور که در تصویر بالا مشاهده میکنید، برای اعمال فیلترینگهای پیچیده میتوانیم از چهار اپراتور , | ( ) استفاده کنیم. به همین جهت اگر نیاز داشتید که در مقدار جستجوی خود از این علائم استفاده کنید، باید قبل از هرکدام از آنها، علامت \ را اضافه کنید.
مثال رجاکس escape character در JavaScript :
let esc = (v) => v.replace(/([(),|])/g, '\\$1')
مثال #C :
var value = "(test,test2)"; var esc = Regex.Replace(value, "([(),|])", "\\$1" ); // esc = \(test\,test2\)
در بخش بعد با امکانات Mapper توکار Gridify و شخصی سازی آن آشنا خواهیم شد.
public class SearchDTO
{
public string TableName { get; set; }
public string ColumnName { get; set; }
public string searchPhrase { get; set; } = string.Empty;
public DateTimeOffset? searchDateFrom { get; set; }
public DateTimeOffset? searchDateTo { get; set; }
public int Include { get; set; } = 1;
} // Join the tables dynamically based on the table names
for (int i = 1; i < filterList.Count; i++)
{
var joinEntityType = entityTypes.FirstOrDefault(t => t.ClrType.Name == filterList[0].TableName)?.ClrType;
if (entityType == null)
{
return (null, 0, 0);
}
var joinEntityQuery = (IQueryable<object>)Activator.CreateInstance(typeof(DbSet<>).MakeGenericType(joinEntityType), _dbContext);
query = query.Join(joinEntityQuery.ToList(),
x => x.GetType().GetProperty($"{filterList[i - 1].TableName}.{filterList[i - 1].TableName}Id").GetValue(x),
y => y.GetType().GetProperty($"{filterList[i].TableName}.{filterList[i].TableName}Id").GetValue(y),
(x, y) => x);
}
// Apply the conditions dynamically based on the column names and conditions
for (int i = 0; i < filterList.Count; i++)
{
if (!string.IsNullOrEmpty(filterList[i].searchPhrase))
{
var parameter = Expression.Parameter(entityType, "x");
var condition = Expression.Call(
typeof(string).GetMethod("Contains", new[] { typeof(string) }),
Expression.PropertyOrField(parameter, filterList[i].ColumnName),
Expression.Constant(filterList[i].searchPhrase)
);
var lambda = Expression.Lambda<Func<object, bool>>(condition, parameter);
query = query.Where(lambda);
}
if (filterList[i].searchDateFrom.HasValue)
{
//must write expression for date constraint
}
}
// Select the specified columns dynamically
ResourceManager resourceManager = new ResourceManager(typeof(TablePropertiesResources));
var columnNames = resourceManager.GetResourceSet(CultureInfo.CurrentCulture, true, true)
.OfType<DictionaryEntry>()
.Select(entry => entry.Key.ToString())
.ToList();
var selectColumns = columnNames.ToArray();
var selectedData = query
.Select(x => new
{
// Dynamically select the desired properties
Result = selectColumns.ToDictionary(column => column, column => x.GetType().GetProperty(column).GetValue(x))
})
.ToList(); var result = _db.Users.Where(filteringExpression).ToList();