من قصد پیاده سازی یک صفحه برای جستجوی پیشرفته بین همه جداول رو دارم. برای این کار یک کلاس تعریف کردم و در ورودی تابع یک لیست از این نوع را بهش پاس میدم. این کلاس اینطور تعریف شده:
کاربر اسم جدول و اون ستونی که میخواد شرط رو براش اعمال کنه رو انتخاب میکنه و بعدش عبارت یا محدوده تاریخ رو وارد میکنه. این که شامل بشه یا نشه رو هم با Include میتونه مشخص کنه.
آیا اینکار با 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; }
من هر چی داکومنت رو خوندم توی همشون اسم جدول رو نمیشد به صورت string وارد کرد. اگه اشتباه میکنم لطفا اصلاح کنید.
رویه ای که مدنظرم هست اینه که داخل یه حلقه for یا foreach یک کوئری بنویسم که همهی جداولی که کاربر انتخاب کرده رو با هم join کنه. بعدش توی یه حلقه دیگه شرطها رو روی ستون هایی که انتخاب کرده اعمال کنم.
در نهایت ستونهای نتیحه نهایی رو Select کنم تا اون ستون هایی که مجاز هستند به سمت کلاینت برگشت داده بشه. اسامی این ستونها رو توی یه فایل .resx ذخیره کردم.
یعنی یه چیزی شبیه به این کد:(ولی این کد درست و قابل اجرا نیست)
// 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();