Я пытаюсь отсортировать список товаров по их цене.
Результирующий набор должен перечислять продукты по цене от низкого до высокого по столбцу LowestPrice
. Тем не менее, этот столбец обнуляется.
Я могу отсортировать список в порядке убывания следующим образом:
var products = from p in _context.Products
where p.ProductTypeId == 1
orderby p.LowestPrice.HasValue descending
orderby p.LowestPrice descending
select p;
// returns: 102, 101, 100, null, null
Однако я не могу понять, как отсортировать это в порядке возрастания.
// i'd like: 100, 101, 102, null, null
orderby p.LowestPrice ?? Int.MaxValue;
это простой способ.OrderByDescending, ThenBy
более понятен.orderby
, и меня отслеживали на стороне, ища его :)Ответы:
Попробуйте поставить оба столбца в одном порядке.
В противном случае каждый заказ - это отдельная операция над коллекцией, каждый раз переупорядочивающая его.
Это должно сначала упорядочить те, которые имеют значение, а затем порядок значений.
источник
orderby p.LowestPrice == null, p.LowestPrice ascending
Надежда помогает кому-то.Это действительно помогает понять синтаксис запроса LINQ и то, как он переводится в вызовы методов LINQ.
Оказывается, что
будет переведен компилятором в
Это решительно не то, что вы хотите. Эта сортировка по
Product.LowestPrice.HasValue
вdescending
порядке , а затем повторно сортирует всю коллекцию с помощьюProduct.LowestPrice
вdescending
порядке.Что вы хотите
который вы можете получить, используя синтаксис запроса:
Подробнее о переводах из синтаксиса запроса в вызовы методов см. В спецификации языка. Шутки в сторону. Прочитайте это.
источник
Решение для строковых значений действительно странное:
Единственная причина, которая работает, состоит в том, что первое выражение
OrderBy()
, сортируетbool
значения:true
/false
.false
результат идет первым, затем следуетtrue
результат (обнуляемый) иThenBy()
сортирует ненулевые значения в алфавитном порядке.Поэтому я предпочитаю делать что-то более читабельное, например:
Если
SomeString
ноль, он будет заменен"z"
и затем отсортировать все по алфавиту.ПРИМЕЧАНИЕ: это не окончательное решение, так как
"z"
идет первым, чем z-значения, какzebra
.ОБНОВЛЕНИЕ 6/6/2016 - По поводу комментария @jornhd, это действительно хорошее решение, но оно все же немного сложное, поэтому я рекомендую обернуть его в класс Extension, например, так:
И просто используйте это как:
источник
У меня есть другой вариант в этой ситуации. Мой список - objList, и я должен заказать, но в конце должны быть нулевые значения. мое решение:
источник
Я пытался найти решение LINQ для этого, но не смог понять это из ответов здесь.
Мой окончательный ответ был:
источник
мое решение:
источник
Это то, что я придумал, потому что я использую методы расширения, а также мой элемент является строкой, поэтому нет
.HasValue
:Это работает с объектами LINQ 2 в памяти. Я не проверял это с EF или любой БД ORM.
источник
Ниже приведен метод расширения для проверки на нулевое значение, если вы хотите отсортировать дочернее свойство keySelector.
И просто используйте это как:
источник
Вот еще один способ:
SUP_APPROVED_IND is char(1) in Oracle db.
Обратите внимание, что
r.SUP_APPROVED_IND.Trim() == null
рассматривается какtrim(SUP_APPROVED_IND) is null
в Oracle db.См. Это для деталей: Как я могу запросить нулевые значения в структуре объекта?
источник
Другой вариант (был удобен для нашего сценария):
У нас есть таблица пользователей, хранящая
ADName, LastName, FirstName
Мы изменили схему таблицы и добавили столбец «SortIndex», который определяет некоторые группы сортировки. (Мы оставили пробел 5, чтобы мы могли вставить группы позже)
Теперь по запросу это будет:
в выражениях метода:
который дает ожидаемый результат:
источник