#c# #.net #linq
Вопрос:
Я пытаюсь отсортировать список, который поступает из моей базы данных. Если все поля в моем OrderFunds
столбце есть null
, я хочу отсортировать их по другому столбцу. Кто-нибудь может сказать мне, как это сделать?
Это мой код:
List<Fund> funds = await fundSupervisor.List().Where(fund => fund.IsActive)
.OrderBy(fund => fund.OrderFunds)
Или мое OrderBy
предложение может допускать null
значения. Это бы мне тоже помогло.
Комментарии:
1. Вы, наверное, хотите
.ThenBy(...)
2.
OrderBy
у вас не должно быть проблем с нулями, однако в вашем коде есть проблема. Похоже, что этотList()
метод, возможно, извлекает записи из базы данных и материализует все в список. ПоследовательноWhere
иOrderBy
выглядят так, как будто они работают со списком в памяти. Это огромная трата ресурсов сервера!3. Если все фонды заказов равны нулю, я хочу отсортировать их по другому столбцу — вам просто нужно поискать
if(list.Any(item => item.OrderFunds != null)) { OrderByOrderFunds } else { OrderBySomethingElse}
. Затем выполняется упорядочение в памяти
Ответ №1:
Это и есть решение
List<Fund> funds = fundSupervisor
.Where(w => w.IsActive)
.OrderBy(w => w.OrderFunds)
.ThenBy(w => w.OtherField).ToList();
ThenBy()
позволяет указать другие поля для сортировки списка.
Комментарии:
1. Я думаю, что название поста плохое, так как это НЕ условие ИЛИ. Но в ситуации операции, когда все значения полей OrderBy равны НУЛЮ, выигрывает ThenBy.
2. @Grandizer то, что ты сказал, правда!
Ответ №2:
Если вам нужно сортировать совершенно по-другому, если и только если все столбцы равны нулю, вам нужно проверить это заранее.
List<Fund> funds = await fundSupervisor.List().Where(fund => fund.IsActive)
if(funds .Any(item => item.OrderFunds != null))
funds = funds.OrderBy(fund => fund.OrderFunds);
else
funds = funds.OrderBy(fund => fund.SomethingElse);
В противном случае, если вы хотите отсортировать по другому значению , если OrderFunds
есть null
, то вы можете просто использовать условие внутри OrderBy
.
var orderedFunds = funds.OrderBy(fund => fund.OrderFunds ?? SomeOtherValue);
Если вы хотите выполнить сортировку по другому значению в качестве вторичной сортировки, используйте a ThenBy
. Это сортирует все значения по ThenBy
значению -, если в операции-несколько одинаковых значений OrderBy
.
var orderedThenByFunds = funds.OrderBy(fund => fund.OrderFunds).ThenBy(fund => fund.SomeOtherValue);
Учтите, что эти линии отличаются:
Допустим, у вас есть 3 предмета (предполагается OrderFunds
, что int?
:
Fund1 { OrderFunds = 1, SomeOtherValue = 8 }
Fund2 { OrderFunds = 3, SomeOtherValue = 6 }
Fund3 { OrderFunds = null, SomeOtherValue = 4 }
Fund4 { OrderFunds = null, SomeOtherValue = 2 }
Затем orderedFunds
вернул бы Fund1(1), Fund4(2[Другое значение]), Fund2(3), Fund3(4[Другое значение]) и orderedThenByFunds
вернул бы Fund1(1,8), Fund2(3,8), Fund4(null,2), Fund3(null,2). Значения в фигурных скобках-это значения, упорядоченные по.