将字符串转换为int以使用LINQ进行排序

时间:2011-05-12 21:52:00

标签: c# .net linq lightspeed

我想通过转换为int的字符串来命令我的列表:

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

但得到:不支持方法'ToInt32'。

6 个答案:

答案 0 :(得分:5)

怎么样:

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

删除任何CLR方法,以便ORM可以将其转换为已知的SQL查询

编辑: 我刚读过想要先转换它,所以:

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

要么从DB中获取所有内容,然后在客户端(linq到object)上进行排序,就像我之前提到的那样,或者在ORM上找到一个方法来按顺序转换为int。在您订购之前选择一个新的列表,其中包含转换后的数字,然后按顺序排序。

EDIT2:

直接演员怎么样才能使用这个ORM?

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

答案 1 :(得分:3)

我是LightSpeed的开发者之一。

LightSpeed 3.11 RTM中的LINQ提供程序不支持Convert.ToInt32。但是我们现在已经通过每晚发布添加了支持,现在可以下载了。

如果您不想使用每晚版本,可以通过下拉到Query Objects 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表达式,而不是更自然的字符串文字。

然而,再一次,每晚版本确实支持LINQ中的Convert.ToInt32,所以如果你想避免每晚构建,你只需要下降到这个级别。

答案 2 :(得分:1)

var orderedListOfRfidTags = (uow.RfidTags.ToList()).OrderBy(t => int.Parse(t.Number));

答案 3 :(得分:0)

我不确定什么类型的“RfidTags”,我也不熟悉Lightspeed ORM,但是我知道当我遇到类似Linq to Sql的麻烦时告诉我一个特定的方法我正在尝试如果不支持Where或OrderBy子句中的调用,那么我只需改变一些东西,以便我处理普通的旧Linq。

例如,你可以尝试一下吗?

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

(是的,可以将它组合成一行,但为了清楚起见,这里显示在两行上。)

祝你好运!

答案 4 :(得分:0)

尝试使用int.Parse代替转换。 Lightspeed可能支持一个而不支持另一个。

var orderedListOfRfidTags = uow.RfidTags
    .OrderBy(t => int.Parse(t.Number))
    .ToList();

答案 5 :(得分:0)

所以,这是我解决这个问题的方法:

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

我首先将IQueryable转换为列表,然后将数据类型字符串的列转换为int32以用于数学运算。

我希望这会有所帮助。