首页 文章

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

提问于
浏览
22

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

3 回答

  • 1

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

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

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

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

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

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

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

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

    这样做的问题是,您正在检索它们都来自数据库的许多值,然后您在内存中进行排序 .

相关问题