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

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

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

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

我是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(query); 

对于强制转换类型而言,LiteralExpression相当冗长的原因是默认情况下LightSpeed通过参数向数据库发送值(以避免SQL注入攻击)。 但是对于CAST函数,SQL引擎需要查看CAST(Number, INTEGER)而不是CAST(Number, @p0) ,其中p0的值为“INTEGER”。 所以你必须使用EmitInline表达式,它绕过参数化,而不是更自然的字符串文字。

不过,夜间版本确实支持LINQ中的Convert.ToInt32,因此如果你想避免每晚构建,你只需要降低到这个级别。

关于什么:

 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(); 
 var orderedListOfRfidTags = (uow.RfidTags.ToList()).OrderBy(t => int.Parse(t.Number)); 

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

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

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

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

祝好运!

尝试使用int.Parse而不是Convert。 Lightspeed很可能支持一个而不支持另一个。

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

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

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

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

我希望这有帮助。