Преобразовать строку в 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 для использования в математических операциях.

Надеюсь, это поможет.

Другие вопросы по тегам