Как заказать целое число в строковом поле в запросе Linq - PullRequest
22 голосов
/ 11 ноября 2011

У меня есть некоторые данные, поступающие из БД, которые я не могу легко изменить схему. Я хочу отсортировать и привязать его к элементу управления на основе числового идентификатора. Проблема состоит в том, что 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 ..

Ответы [ 3 ]

14 голосов
/ 11 ноября 2011

Это будет не так эффективно, потому что вы не используете запрос к базе данных для фильтрации своих результатов, но в основном это запрос всех данных, а затем фильтрация на клиенте.

myControl.DataSource = dataFromDB.ToList().OrderBy(o => int.Parse(o.StringHoldingAnInt));
4 голосов
/ 08 декабря 2017

Это возможно сделать на стороне БД. Идея взята из здесь . Таким образом, выполняется сортировка по правильно отформатированной строке (слева добавляется ноль символов, а затем справа берется необходимое количество символов)

myControl.DataSource = dataFromDB
    .OrderBy(o =>  DbFunctions.Right("00000" + o.StringHoldingAnInt, 7));
1 голос
/ 11 ноября 2011

Вы можете преобразовать запрос в список:

var query = ...;
var list = query.ToList();

Теперь вы можете упорядочить по значениям, преобразовав его:

list.OrderBy(o => int.Parse(o.StringHoldingAnInt));

Проблема в том, что вы получаетемного значений все они приходят из базы данных, а затем вы заказываете в памяти.

...