Порядок Linq по десятичному полю сортируется как строка?

1

Я полностью озадачен и не могу найти что-либо в Интернете об этом, так что я должен делать что-то неправильно?

 _positionsRepo.GetAllTrades().OrderByDescending(x => x.TotalPLPercent).ToList();

TotalPLPercent - это десятичное поле. результат упорядочивается следующим образом:

96.76
95.54
8.54
75.55
231.22
13

Очевидно, это неправильно. Я проверил сортировку против другого поля, которое было двойным, и работало, как ожидалось. Что мне не хватает здесь о десятичных знаках в С#?

Я использую драйвер Mongo DB С#.

  • 0
    Попробуйте добавить .ToList(). между GetAllTrades() и OrderByDescending() . Таким образом, список будет отсортирован в памяти, а не в базе данных (я подозреваю, что это как-то связано с этим).
  • 0
    Убедитесь, что TotalPLPercent не является строкой.
Показать ещё 4 комментария
Теги:
linq

3 ответа

3
Лучший ответ

Драйвер С# Mongo DB сериализует decimal строку в виде строки (исходный код драйвера подтверждает это).

Он делает это, потому что нет типа BSON для десятичного числа - double не имеет такой же точности. К сожалению, это означает, что вы не можете сравнивать "десятичные" значения как числа.

Вы можете сортировать данные в памяти, например:

_positionsRepo.GetAllTrades()
   .ToList()
   .OrderByDescending(x => x.TotalPLPercent)
   .ToList();

Другим вариантом было бы хранить количество центов (или сотых долей) как длинное целое число. Затем вы можете сортировать их нормально, и вам просто нужно разделить на 100 (или 10 000), чтобы получить реальную ценность.

  • 0
    Благодарю. работает. но, похоже, не идеально подходит для производительности сейчас.
  • 0
    Ну, вы все равно извлекаете все строки, я не думаю, что это будет иметь слишком большое значение, если только ваш набор данных не очень большой.
2

По-видимому, это проблема с MongoDB Driver for C#. Проверьте этот открытый вопрос здесь -

тип "System.Decimal" сохраняет как "String"

Как вы можете видеть, поскольку Decimal сохраняется как String, он, несомненно, будет сортироваться как строка. Я думаю, вы должны попробовать double вместо decimal пока они не исправит эту проблему.

  • 0
    Опасно использовать double для значений валюты - вы получаете ошибки округления с плавающей запятой.
1

Вы уверены, что тип x равен десятичному? Похоже, он делает строковый порядок. (Я бы поставил точку останова на "x.TotalPLPercent", а затем оценил тип x, чтобы дважды проверить его, как я думал.)

  • 0
    да, это определенно десятичное число. я думаю, что это ошибка в драйвере mongodb C # с десятичными числами. так как, возможно, Монго смотрит на это как на строку. проверьте комментарии на мой вопрос, решение есть. не идеально, но это работает.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню