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

Dan*_*ely 24 c# linq linq-to-entities sql-order-by

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

myControl.DataSource = dataFromDB.OrderBy(o => int.Parse(o.StringHoldingAnInt));
Run Code Online (Sandbox Code Playgroud)

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

Convert.ToInt32 也不起作用.

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

排序为字符串是不合适的,因为这些值的长度不是全部相同,它们会按如下顺序排序:1,10,11,2,3 ..

Ste*_*ner 16

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

myControl.DataSource = dataFromDB.ToList().OrderBy(o => int.Parse(o.StringHoldingAnInt));
Run Code Online (Sandbox Code Playgroud)

  • 对于阅读本文的人:这将在内存中加载整个数据库表。 (3认同)

小智 8

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

dataFromDB.OrderBy(o => o.StringHoldingAnInt.Length).ThenBy(o => o.StringHoldingAnInt)
Run Code Online (Sandbox Code Playgroud)

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


Rom*_*ada 7

可以在 DB 端执行此操作。这个想法来自这里。所以它按格式正确的字符串进行排序(在左边添加零个字符,然后从右边获取所需的字符量)

myControl.DataSource = dataFromDB
    .OrderBy(o =>  DbFunctions.Right("00000" + o.StringHoldingAnInt, 7));
Run Code Online (Sandbox Code Playgroud)