如何在Linq查询中的字符串字段中排序

时间:2011-11-10 20:31:26

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

我有一些来自数据库的数据,我无法轻易改变其架构。我想对它进行排序并将其绑定到基于数字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 ..

4 个答案:

答案 0 :(得分:14)

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

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

答案 1 :(得分:4)

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

with search as
(
  select 1 v
  union all
  select 2 v
  union all
  select 3 v
)
select distinct t.* 
from table_name t
join search s on t.col1 = s.v or t.col2 = s.v or t.col3 = s.v

答案 2 :(得分:4)

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

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

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

答案 3 :(得分:1)

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

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

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

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

这个问题是你要检索它们都来自数据库的大量值,然后你在内存中订购。