我想通过转换为int的字符串来命令我的列表:
var orderedListOfRfidTags = uow.RfidTags.OrderBy(t => Convert.ToInt32(t.Number)).ToList();
但得到:不支持方法'ToInt32'。
答案 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以用于数学运算。
我希望这会有所帮助。