Подтвердить что ты не робот

Как 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..

4b9b3361

Ответ 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));