Как OrderBy целое число в строковом поле в запросе Linq
У меня есть некоторые данные, выходящие из БД, которые я не могу легко изменить схему. Я хочу отсортировать его и привязать к элементу управления, основанному на числовом идентификаторе. Проблема заключается в том, что API хранит номер в строковом поле, а не как int
и Linq barfs при попытке конверсии.
myControl.DataSource = dataFromDB.OrderBy(o => int.Parse(o.StringHoldingAnInt));
LINQ to Entities не распознает метод "Int32 Parse (System.String)", и этот метод не может быть переведен в выражение хранилища.
Convert.ToInt32
тоже не работает.
LINQ to Entities не распознает метод 'Int32 ToInt32 (System.String)', и этот метод не может быть переведен в выражение хранилища.
Сортировка как строка не подходит, потому что значения не имеют одинаковой длины, и они будут упорядочивать их следующим образом: 1, 10, 11, 2, 3..
Ответы
Ответ 1
Это будет не так эффективно, потому что вы не используете запрос базы данных для фильтрации ваших результатов, но это будет в основном запрашивать все данные, а затем фильтровать на клиенте.
myControl.DataSource = dataFromDB.ToList().OrderBy(o => int.Parse(o.StringHoldingAnInt));
Ответ 2
Вы можете преобразовать запрос в список:
var query = ...;
var list = query.ToList();
Теперь вы можете упорядочивать значения, преобразуя его:
list.OrderBy(o => int.Parse(o.StringHoldingAnInt));
Проблема заключается в том, что вы извлекаете множество значений, все они поступают из базы данных, а затем вы заказываете в памяти.
Ответ 3
Это можно сделать на стороне БД. Идея взята из здесь. Поэтому он сортирует по правильно отформатированной строке (нулевые символы добавляются влево, а затем необходимое количество символов берется справа)
myControl.DataSource = dataFromDB
.OrderBy(o => DbFunctions.Right("00000" + o.StringHoldingAnInt, 7));