У меня есть IEnumerable объектов базы данных, полученных через:
var customers = _dbcontext.Customer.Where(x => x.ClientId > 0 && x.isDeleted == null);
customers = sortCustomers(customers, sortOrder, sortDirection);
Чтобы отсортировать клиентов IEnumerable, у меня есть метод с именем SortCustomers()
(реализован ниже), который сопоставляет аргумент sortOrder
со свойствомиспользовать для сортировки.Он также использует sortDirection
, чтобы определить, использовать ли нисходящее или восходящее направление.
Сначала я использовал orderBy()
, который будет восходящим, а затем использовал Reverse()
в конечном результате, если было указано нисходящее направление.
Другой вариант, который создает более длинный и повторяющийся код, заключается в использовании OrderByDescending () на каждом шаге (см. Код ниже).
Использует ли IEnumerable <>. Reverse () делает то же самое, что и OrderByDescending () в этом случае (без отмены отложенной загрузки)?
Опция 1:
private IEnumerable<Customer> sortCustomers(IEnumerable<Customer> unsortedCustomers, string sortOrder, string sortDirection)
{
if (sortOrder == MODEL.VMSortDescriptors.CustomerVMSortDescriptor.CompanyName.ToString())
{
unsortedCustomers = unsortedCustomers.OrderBy(c => c.CompanyName);
}
else if (sortOrder == MODEL.VMSortDescriptors.CustomerVMSortDescriptor.ContactPerson.ToString())
{
unsortedCustomers = unsortedCustomers.OrderBy(c => c.ContactPerson);
}
else if (sortOrder == MODEL.VMSortDescriptors.CustomerVMSortDescriptor.EmailId.ToString())
{
unsortedCustomers = unsortedCustomers.OrderBy(c => c.EmailId);
}
//many more sort properties
//Asc or Desc
if (sortDirection == VMSortDescriptors.SortDirection.Descending.ToString())
unsortedCustomers = unsortedCustomers.Reverse();
return unsortedCustomers;
}
Опция 2:
private IEnumerable<Customer> sortCustomers(IEnumerable<Customer> unsortedCustomers, string sortOrder, string sortDirection)
{
bool isAscendingOrder = (sortDirection == VMSortDescriptors.SortDirection.Ascending.ToString());
if (sortOrder == MODEL.VMSortDescriptors.CustomerVMSortDescriptor.CompanyName.ToString())
{
if (isAscendingOrder)
unsortedCustomers = unsortedCustomers.OrderBy(c => c.CompanyName);
else
unsortedCustomers = unsortedCustomers.OrderByDescending(c => c.CompanyName);
}
else if (sortOrder == MODEL.VMSortDescriptors.CustomerVMSortDescriptor.ContactPerson.ToString())
{
if (isAscendingOrder)
unsortedCustomers = unsortedCustomers.OrderBy(c => c.ContactPerson);
else
unsortedCustomers = unsortedCustomers.OrderByDescending(c => c.ContactPerson);
}
else if (sortOrder == MODEL.VMSortDescriptors.CustomerVMSortDescriptor.EmailId.ToString())
{
if (isAscendingOrder)
unsortedCustomers = unsortedCustomers.OrderBy(c => c.EmailId);
else
unsortedCustomers = unsortedCustomers.OrderByDescending(c => c.EmailId);
}
//many more sort properties
return unsortedCustomers;
}
ОБНОВЛЕНИЕ
Что касается сопоставления аргумента sortOrder со свойством, да, я мог бы использовать отражение или что-то еще, чтобы получить значение свойства для элементовв IEnumerable.Я сделал это изначально, с общей функцией сортировки.Но все осложнилось с анонимными результатами.Поэтому я решил пойти просто и прямо.