Кажется, что в вашем коде есть два препятствия, первое включает получение имени свойства из строки, представленной this.Sort
. Это, вероятно, будет включать в себя некоторый код отражения. Вторая часть включает сокращение количества кода, необходимого для указания сортировки по возрастанию и сортировки по убыванию.
Вы могли бы сделать это несколькими способами. Первой идеей, о которой я подумал, было создание метода расширения для OrderBy, который бы использовал аргумент bool SortDir. Существует несколько перегрузок для OrderBy, допускающих Func<T,TKey>
KeySelectors и IComparer<T>
. Я покажу вам простой с просто keySelector, но вы можете реализовать их все для полностью универсального решения
public static class IEnumerableExtentions
{
public static IEnumerable<T> OrderBy<T,TKey>(this IEnumerable<T> source, Func<T, TKey> keySelector, bool reverse)
{
return reverse ? source.OrderByDescending(keySelector) : source.OrderBy(keySelector);
}
}
Имея это, вы могли бы написать свой код без всех этих if
switch (this.Sort)
{
case "ITApplication.Name":
this.Issues = this.db.ITIssues.OrderBy(i => i.ITApplication.Name, this.SortDir == "ASC").Where(i => i.ITAppGroupID == this.ITAppGroupID);
break;
/*...*/
}
В качестве второго решения для определения порядка сортировки вы передаете IComparer
, который использует SortDir. Вот реализация IComparer, которую вы можете использовать
class ReversableComparer : IComparer<IComparable>
{
private bool _reverse;
public ReversableComparer(bool reverse)
{
_reverse = reverse;
}
public int Compare(IComparable x, IComparable y)
{
return _reverse ? y.CompareTo(x) : x.CompareTo(y);
}
}
Тогда вы могли бы написать свой код
switch (this.Sort)
{
case "ITApplication.Name":
this.Issues = this.db.ITIssues.OrderBy(i => i.ITApplication.Name, new ReversableComparer(this.SortDir != "ASC")).Where(i => i.ITAppGroupID == this.ITAppGroupID);
break;
/*...*/
}
Это немного больше кода, чтобы написать, но он есть, если вам это нужно.
Что касается имени / отражения свойства, если вы используете Linq как часть Linq to SQL, динамическая ссылка linq, предоставляемая @AlbertVo, может стоить посмотреть. Если вы больше работаете с Linq to Objects, то вместо i => i.ITApplication.Name
попробуйте поиграть с i => i.GetType().GetProperty(this.Sort).GetValue(i, null)
Конечно, вам понадобится System.Reflection
, чтобы это работало, и это может быть медленнее, чем ваше первоначальное решение.
Я надеюсь, что это помогло. Приветствия.
EDIT
Таким образом, эти два метода могут быть объединены. Ваш окончательный код может выглядеть так:
public static class IEnumerableExtentions
{
public static IEnumerable<T> OrderBy<T,TKey>(this IEnumerable<T> source, Func<T, TKey> keySelector, bool reverse)
{
return reverse ? source.OrderByDescending(keySelector) : source.OrderBy(keySelector);
}
}
void Main()
{
this.Issues = this.db.ITIssues
.OrderBy(i => i.GetType().GetProperty(this.Sort).GetValue(i, null),
this.SortDir == "ASC")
.Where(i => i.ITAppGroupID == this.ITAppGroupID);
}