Linq to SQL - как отсортировать поле varchar, которое содержит числа и шестнадцатеричные значения - PullRequest
1 голос
/ 23 января 2011

У меня есть предоставленный клиентом набор данных, в котором есть набор кодов групп. В группе 1 у меня есть 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 и далее 1А, 2А и т. Д.

Тип данных в настоящее время varchar (10), и клиент хочет, чтобы порядок сортировки был следующим: 1 2 3 4 5 6 7 8 9 10 1A 2A ...

но вместо этого выходит: 1 10 1A 2 2A 3 4 5 6 7 8 9 ...

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

Ответы [ 2 ]

1 голос
/ 23 января 2011

Вы уверены, что в этом столбце будет только число (в шестнадцатеричном формате, но это не имеет значения)? Если да, то было бы лучше изменить структуру таблицы и сохранить сам номер (и отформатировать его только для просмотра / редактирования). В этом случае сортировка может быть легко выполнена на стороне сервера (я имею в виду сервер БД).

0 голосов
/ 23 января 2011

Обычно этого можно добиться, анализируя строки как числа и задавая System.Globalization.NumberStyles.AllowHexSpecifier.

Поскольку это LINQ to SQL, для этого не будет перевода. Поэтому вам нужно применить сортировку после завершения остальной части вашего запроса и немедленно выполнить ее с помощью AsEnumerable или ToList. Имейте в виду, что при этом все соответствующие данные, запрошенные запросом, будут отправлены клиенту, поэтому важно предварительно отфильтровать, а затем применить сортировку на стороне клиента.

Ваш запрос будет похож на этот:

dc.Table
  .Select(o => o.Number) // where number is the property/column name
  .AsEnumerable()
  .OrderBy(s => Int32.Parse(s, System.Globalization.NumberStyles.AllowHexSpecifier))

Вот пример этого в действии без LINQ to SQL:

string[] numbers = { "1", "10", "1A", "2", "2A", "3", "4", "5", "6", "7", "8", "9" };
var query = numbers.OrderBy(s => Int32.Parse(s, System.Globalization.NumberStyles.AllowHexSpecifier));
foreach (var s in query)
    Console.WriteLine(s);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...