3

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

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

但得到:不支持“ToInt32”方法。

4

6 回答 6

6

关于什么:

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();
于 2011-05-12T22:03:42.590 回答
3

我是 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,因此如果您想避免进行夜间构建,只需降级到此级别即可。

于 2011-05-19T21:20:37.743 回答
1
var orderedListOfRfidTags = (uow.RfidTags.ToList()).OrderBy(t => int.Parse(t.Number));
于 2012-05-18T14:19:31.253 回答
0

我不确定“RfidTags”是哪种类型,我也不熟悉 Lightspeed ORM,但我知道当我遇到 Linq to Sql 的类似问题时,我会告诉我我正在尝试调用的特定方法不支持 Where 或 OrderBy 子句,然后我只是改变一些东西,以便我处理普通的旧 Linq。

例如,你能试试这个吗?

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

(是的,可以将其合并为一行,但为清楚起见,此处显示为两行。)

祝你好运!

于 2011-05-12T22:11:18.070 回答
0

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

var orderedListOfRfidTags = uow.RfidTags
    .OrderBy(t => int.Parse(t.Number))
    .ToList();
于 2011-05-12T22:29:03.707 回答
0

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

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

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

我希望这有帮助。

于 2013-02-15T22:52:41.007 回答