Преобразовать строку в int для заказа с использованием LINQ - PullRequest
3 голосов
/ 13 мая 2011

Я бы хотел упорядочить свой список по строке, преобразованной в целое число:

var orderedListOfRfidTags = uow.RfidTags.OrderBy(t => Convert.ToInt32(t.Number)).ToList();

но получить: метод ToInt32 не поддерживается.

Ответы [ 6 ]

5 голосов
/ 13 мая 2011

Как насчет:

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();
3 голосов
/ 20 мая 2011

Я один из разработчиков LightSpeed.

Поставщик LINQ в LightSpeed ​​3.11 RTM не поддерживает Convert.ToInt32.Однако теперь мы добавили поддержку через ночной выпуск, который доступен для загрузки.

Если вы не хотите использовать ночной выпуск, вы можете достичь желаемого результата, перейдя в API-интерфейс Query Objects.и вызывая функцию 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, поэтому вам нужно только перейти кэтот уровень, если вы хотите избежать ночной сборки.

1 голос
/ 18 мая 2012
var orderedListOfRfidTags = (uow.RfidTags.ToList()).OrderBy(t => int.Parse(t.Number));
0 голосов
/ 16 февраля 2013

Итак, вот мое решение этой проблемы:

var query = (from q in query select q).ToList().Where(x => Convert.ToInt32(x.col_string) > 0);

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

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

0 голосов
/ 13 мая 2011

Попробуйте использовать int.Parse вместо Convert.Вероятно, Lightspeed поддерживает одно без поддержки другого.

var orderedListOfRfidTags = uow.RfidTags
    .OrderBy(t => int.Parse(t.Number))
    .ToList();
0 голосов
/ 13 мая 2011

Я не уверен, что это за тип "RfidTags", и я не знаком с Lightspeed ORM, но я знаю, что когда у меня были подобные проблемы с Linq и Sql, который говорил мне, что конкретный метод я пытаюсь вызывать в предложении Where или OrderBy не поддерживается, тогда я просто изменяю вещи так, чтобы вместо этого я имел дело с простым старым Linq.

Например, не могли бы вы попробовать это?

var listOfRfidTags = uow.RfidTags.ToList();
var orderedListOfRfidTags = listOfRfidTags.OrderBy(t => Convert.ToInt32(t.Number));

(да, это возможно объединить в одну строку, но показано здесь в две строки для ясности.)

Удачи!

...