Сортировка полей после чтения их из БД

95
06 февраля 2021, 05:00

есть модель

public class Model
{
    public int Id {get;set;}
    public string Title {get;set;}
    public double Price {get;set;}
    public DateTime FinishSelDate {get;set;}
}

функция которая вычитает данные с БД по модели (подробности опускаю)

public List<ModelDTO> GetData()
{
    return context.ModelRepository.Read()// Прочитает все модели из БД
    .OrederBy(m => m.Title) // Отсортирует оп убываню по названию
    .Select(t => new ModelDTO
        { //TODO 
        })
    .ToList();
}

Можно как-то написать универсальную функцию для сортировки любого поля???

хотелось бы вроде такого что-то:

public List<ModelDTO> GetData(Dictionary<string,string> sort){//TODO} 

где sort - {"Title","Asc"} - поле и как сортировать

Т. е. вопрос в том, как потом эту стрингу- Title впихнуть в OrderBy???

Answer 1

Подключите в NuGet System.Linq.Dynamic.

Добавляете его в using и в коде сможете использовать конструкцию типа

public List<ModelDTO> GetData(string property, string orderType)
{
    return context.ModelRepository.Read()
    .OrederBy(property + " " + orderType)
    .Select(t => new ModelDTO
        { //TODO 
        })
    .ToList();
}

orderType значения "ASC" или "DESC"

Если надо несколько сортируемых параметров, то их следует сформировать в строку через запятую (например "поле1 DESC, поле2 ASC")

Answer 2
public static string GetReflectedPropertyValue(this object subject, string field)
{
    object reflectedValue = subject.GetType().GetProperty(field).GetValue(subject, null);
    return reflectedValue != null ? reflectedValue.ToString() : "";
}

использование

List<Person> persons = new List<Person>();
persons.Add(new Person("Вася", 12, "4Б"));
persons.Add(new Person("Петя", 12, "11А"));
persons.Add(new Person("Галя", 19, "11А"));
persons.Add(new Person("Анна", 15, "6А"));
var result2 = persons.OrderByDescending(p => p.GetReflectedPropertyValue("Age")).ToList();
Answer 3
    public void SortBy(string field, ListSortDirection type)
    {
        var propertyInfo = typeof(Student).GetProperty(field);
        students = type == ListSortDirection.Ascending ? students.OrderBy(x => propertyInfo.GetValue(x, null)).ToList() : students.OrderByDescending(x => propertyInfo.GetValue(x, null)).ToList();
    }

Использование

persons.SortBy("Age", ListSortDirection.Ascending);
Answer 4

Еще один метод сортировки через Expression tree

private static IEnumerable<T> GetSortedData<T>(IQueryable<T> list, string sortColumnName) 
{ 
    var type = typeof(T); 
    var property = type.GetProperty(sortColumnName); 
    var parameter = Expression.Parameter(type, "p"); 
    var propertyAccess = Expression.Property(parameter, property); 
    var orderByExp = Expression.Lambda(propertyAccess, parameter); 
    MethodCallExpression resultExp = Expression.Call(typeof(Queryable), "OrderBy", new[] { type, property.PropertyType }, list.Expression, Expression.Quote(orderByExp)); 
    return (IEnumerable<T>)Expression.Lambda(resultExp).Compile().DynamicInvoke(); 
} 
READ ALSO
не отображается библиотека к проекту C#

не отображается библиотека к проекту C#

Возникла проблема, не могу подключить библиотеку к своему проектуВ ссылках проекта она не появляется

92
Вытащить данные из TXT в datagridview. C#

Вытащить данные из TXT в datagridview. C#

Есть такой файл TXT (картинка ниже)Мне нужно как то сделать так, чтобы в базу DATAGRIDVIEW записывалась строка, у которой начало строки начинается...

137
Модернизация и плавная прокрутка ScrollViewer

Модернизация и плавная прокрутка ScrollViewer

Столкнулся с такой проблемойЕсть в xaml такая разметка:

113
Не меняется текст UILabel

Не меняется текст UILabel

У меня есть некоторый UILabel titleLabel, который инициализируется в конструкторе, Frame же указывается в LayoutSubview

110