PDA

View Full Version : OrderBy در LINQ به صورت پویا؟



Saeed_m_Farid
شنبه 12 اسفند 1391, 12:42 عصر
با سلام
میخواستم بدونم دوستان راهی برای OrderBy کردن کوئری در LINQ بصورت پارامتری (رشته) سراغ دارند؟ کاری که من الان انجام میدم و بنظرم نامطمئن میاد، اینه:

public List<Regions> GetRegions(string sorting = "", bool ascending = false)
{
IEnumerable<Regions> query = _db.Regions;

var field = typeof(Regions).GetProperty(sorting);

if (string.IsNullOrEmpty(sorting))
{
query = query.OrderBy(r => r.Name);
}
else if (ascending)
query = query.OrderBy(r => field.GetValue(r, null));
else
query = query.OrderByDescending(r => field.GetValue(r, null));

return query.ToList();
}

Saeed_m_Farid
سه شنبه 15 اسفند 1391, 19:57 عصر
من مطمئنم که توضیحاتم ناقص بوده که دوستان جوابی ندادن، اگه فرض کنیم Regions یه مدل از مدلهای پروژه MVC دات نت هست، بنده تصمیم دارم یه Repository (مخزن داده و توابع لینک برای عملیات CRUD) درست کنم که لازم نباشه تو کنترلرهام کدهای لینک قرار داشته باشند؛ این تابع یکی از توابعی هست که به این منظور نوشته شده و برای گرفتن لیستی از موجودیت ها و مرتب سازی خروجی بر حسب فیلدی هست که بعنوان پارامتر به تابع داده میشه! اصلاً هم نبوغ خودم نیست و تازه فهمیدم که خیلی ها همچین کاری میکنند.
با این توضیحات، اینطوری کد رو تغییرش دادم، نظرتون چیه :


public List<Regions> GetRegions(
int startIndex = 0,
int count = 0,
string sorting = "",
bool ascending = true)
{
IEnumerable<Regions> query = _db.Regions;

System.Reflection.PropertyInfo field = null;

if (string.IsNullOrEmpty(sorting))
query = query.OrderBy(r => r.Name);
else
{
try
{
field = typeof(Regions).GetProperty(sorting);

if (ascending)
query = query.
OrderBy(r => field.GetValue(r, null));
else
query = query.
OrderByDescending(r => field.GetValue(r, null));
}
catch (System.Exception) { }
}
return count > 0
? query.Skip(startIndex).Take(count).ToList() //Paging
: query.ToList(); //No paging
}

اگه کسی خواست و ابراز تمایل فرمود :لبخند:، با کمال میل توضیحات بیشتر رو تقدیم میکنم...