Преобразовать строку в int для заказа с использованием LINQ
Я хотел бы упорядочить свой список по строке, преобразованной в int:
var orderedListOfRfidTags = uow.RfidTags.OrderBy(t => Convert.ToInt32(t.Number)).ToList();
но получить: метод ToInt32 не поддерживается.
6 ответов
Я один из разработчиков LightSpeed.
Поставщик LINQ в LightSpeed 3.11 RTM не поддерживает Convert.ToInt32. Однако теперь мы добавили поддержку через ночной выпуск, который доступен для скачивания.
Если вы не хотите использовать ночной выпуск, вы можете достичь желаемого результата, перейдя в API объектов запросов и напрямую вызвав функцию SQL CAST. Это будет выглядеть примерно так:
Query query = new Query
{
Order = Order.By(Entity.Attribute("Number")
.Function("CAST", new LiteralExpression("INTEGER") { EmitInline = true }))
};
uow.Find<RfidTag>(query);
Причина довольно многословного выражения LiteralExpression для типа приведения заключается в том, что по умолчанию LightSpeed отправляет значения в базу данных через параметры (чтобы избежать атак с использованием SQL-инъекций). Но для функции CAST движок SQL должен видеть CAST(Number, INTEGER)
скорее, чем CAST(Number, @p0)
где p0 имеет значение "INTEGER". Поэтому вы должны использовать выражение EmitInline, которое обходит параметризацию, а не более естественный строковый литерал.
Тем не менее, еще раз, ночной выпуск поддерживает Convert.ToInt32 в LINQ, поэтому вам нужно только перейти на этот уровень, если вы хотите избежать ночной сборки.
Как насчет:
var orderedListOfRfidTags = uow.RfidTags.OrderBy(t => t.Number).ToList();
удалите любой метод CLR, чтобы ORM мог преобразовать его в известный запрос SQL
РЕДАКТИРОВАТЬ: Я только что прочитал хочу сначала преобразовать это так:
var orderedListOfRfidTags = uow.RfidTags.ToList().OrderBy(t => Convert.ToInt32(t.Number));
либо получить все из БД, затем заказать его на клиенте (linq to object), как я уже упоминал ранее, либо найти метод в ORM для приведения к int порядка. Перед заказом Выберите новый список с преобразованным числом, затем заказывайте его.
Edit2:
А как насчет прямого каста, он работает с этим ORM?
var orderedListOfRfidTags = uow.RfidTags.OrderBy(t => (int)t.Number).ToList();
var orderedListOfRfidTags = (uow.RfidTags.ToList()).OrderBy(t => int.Parse(t.Number));
Попробуй использовать int.Parse
вместо конвертировать. Вполне вероятно, что Lightspeed поддерживает одно без поддержки другого.
var orderedListOfRfidTags = uow.RfidTags
.OrderBy(t => int.Parse(t.Number))
.ToList();
Я не уверен, что это за тип "RfidTags", и я не знаком с Lightspeed ORM, но я знаю, что когда у меня были подобные проблемы с Linq и Sql, который говорил мне, что конкретный метод я пытаюсь вызвать в Предложение Where или OrderBy не поддерживается, тогда я просто изменяю ситуацию так, что вместо этого имею дело с простым старым Linq.
Например, не могли бы вы попробовать это?
var listOfRfidTags = uow.RfidTags.ToList();
var orderedListOfRfidTags = listOfRfidTags.OrderBy(t => Convert.ToInt32(t.Number));
(да, это возможно объединить в одну строку, но показано здесь в две строки для ясности.)
Удачи!
Итак, вот мое решение этой проблемы:
var query = (from q in query select q).ToList().Where(x => Convert.ToInt32(x.col_string) > 0);
Сначала я привел IQueryable к списку, а затем преобразовал столбец строки типа данных в int32 для использования в математических операциях.
Надеюсь, это поможет.