【问题标题】:How to OrderBy an integer in a string field in a Linq query [duplicate]如何在 Linq 查询的字符串字段中按整数排序 [重复]
【发布时间】:2011-11-10 20:31:25
【问题描述】:

我有一些来自数据库的数据,我无法轻易更改其架构。我想对其进行排序并将其绑定到基于数字 ID 的控件。问题是 API 将数字存储在字符串字段中,而不是作为 int 和 Linq barfs 在转换尝试。

myControl.DataSource = dataFromDB.OrderBy(o => int.Parse(o.StringHoldingAnInt));

LINQ to Entities 无法识别方法“Int32 Parse(System.String)”方法,并且该方法无法转换为存储表达式。

Convert.ToInt32 也不起作用。

LINQ to Entities 无法识别方法“Int32 ToInt32(System.String)”方法,并且该方法无法转换为存储表达式。

不适合作为字符串排序,因为值的长度不完全相同,并且会像这样对它们进行排序:1、10、11、2、3..

【问题讨论】:

  • 有多少数据?在客户端排序是否可行?
  • 您可以尝试用 '0' 填充字符串,以便它们都具有相同的长度......但我不确定 Linq 是否支持 String.PadLeft。
  • @dlev 数据库中有几百行,在我从问题中省略的 Where() 查询之后只有几十行。
  • @ThomasLevesque Linq-to-Entities 也不喜欢 String.PadLeft。

标签: c# linq linq-to-entities sql-order-by


【解决方案1】:

这不会那么有效,因为您没有利用数据库查询来过滤结果,但这基本上会查询所有数据,然后在客户端上进行过滤。

myControl.DataSource = dataFromDB.ToList().OrderBy(o => int.Parse(o.StringHoldingAnInt));

【讨论】:

  • 我的未删节查询在按命令排序之前执行 Where() 以将数据量减少到合理的大小,因此客户端处理负担不应过大。
  • 对于那些阅读本文的人:这会将整个数据库表加载到内存中。
【解决方案2】:

想出了一个简单的技巧来解决这个问题:先按长度排序,然后再正常。

dataFromDB.OrderBy(o => o.StringHoldingAnInt.Length).ThenBy(o => o.StringHoldingAnInt)

这一切都在数据库中完成,不会加载到内存中。

【讨论】:

  • 您还需要添加额外的逻辑来处理负数。
  • @LukeTBrooks 我不相信你链接的文档支持这一点。 OrderBy 不是转换运算符,不会立即执行。事实上,OrderBy/ThenBy 组合是专门为利用延迟执行而设计的。
  • 我实际上更喜欢这个解决方案,因为它不依赖于任何魔法常数,并且适用于任何大小的字符串编码整数(假设没有前导零)
  • 这似乎应该是解决这个问题的最佳答案
【解决方案3】:

可以在数据库端进行。这个想法来自here。所以它通过正确格式化的字符串进行排序(零个字符添加到左侧,然后从右侧获取所需数量的字符)

myControl.DataSource = dataFromDB
    .OrderBy(o =>  DbFunctions.Right("00000" + o.StringHoldingAnInt, 7));

【讨论】:

  • +1 用于使用 DBFunctions 而不是提供者特定的 SqlFunctions 的解决方案。这比根据原始值的长度复制可变数量的零要简单得多。
  • 嗯,如果你添加了一个转换数据库函数,那么你可以按结果排序......
【解决方案4】:

您可以将查询转换为列表:

var query = ...;
var list = query.ToList();

现在您可以通过转换来按值排序:

list.OrderBy(o => int.Parse(o.StringHoldingAnInt));

这样做的问题是您要检索大量值,它们都来自数据库,然后您在内存中排序。

【讨论】:

  • 所以没有人会感到困惑,.OrderBy() 返回一个IEnumerable。上面的list.OrderBy() 行目前什么都不做,因为您没有将.OrderBy() 的返回值分配给变量。
猜你喜欢
  • 2013-07-27
  • 2015-12-20
  • 1970-01-01
  • 1970-01-01
  • 2020-02-19
  • 1970-01-01
  • 2012-09-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多