我想通过转换为 int 的字符串来排序我的列表:
var orderedListOfRfidTags = uow.RfidTags.OrderBy(t => Convert.ToInt32(t.Number)).ToList();
但得到:不支持“ToInt32”方法。
我想通过转换为 int 的字符串来排序我的列表:
var orderedListOfRfidTags = uow.RfidTags.OrderBy(t => Convert.ToInt32(t.Number)).ToList();
但得到:不支持“ToInt32”方法。
关于什么:
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 上找到一个方法来转换它的顺序。在您订购之前选择一个已转换数字的新列表,然后按它订购。
编辑2:
直接演员如何与这个 ORM 一起工作?
var orderedListOfRfidTags = uow.RfidTags.OrderBy(t => (int)t.Number).ToList();
我是 LightSpeed 的开发者之一。
LightSpeed 3.11 RTM 中的 LINQ 提供程序不支持 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 表达式,而不是更自然的字符串文字。
不过,再一次强调,夜间版本确实支持 LINQ 中的 Convert.ToInt32,因此如果您想避免进行夜间构建,只需降级到此级别即可。
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
而不是转换。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 转换为一个列表,然后将数据类型 string 的列转换为 int32 以用于数学运算。
我希望这有帮助。