DataTable - 动态Linq OrderBy使用Lambda表达式

时间:2014-09-25 23:46:49

标签: c# .net linq dynamic-linq

我在DataTable中获取记录集合并将其绑定到网格控件。在绑定之前,我根据几个条件对数据进行排序。为简洁起见,我将解释测试场景。

我有两个字段类别和国家/地区。我想首先根据类别然后按国家/地区对记录进行排序。但是这里的问题是我想将所有空类别值推到最后,然后根据字母顺序排序。

为此,我正在做 -

var rows = dt.AsEnumerable()
        .OrderBy(r => string.IsNullOrEmpty(Convert.ToString(r["Category"]))) //push empty values to bottom
        .ThenBy(r => Convert.ToString(r["Category"]))
        .ThenBy(r => Convert.ToString(r["Country"]))

但是现在,基于我需要排序的字段是动态的,我在一个数组中。

如何使用lambda表达式根据字段动态排序记录? (将空值推到最后)

1 个答案:

答案 0 :(得分:1)

我认为你所谈论的数组是一个字符串数组。

var columns = new string[] { "Category", "Country" };

var rows = dt.AsEnumerable().OrderBy(x => 0);
foreach(var columnName in columns)
{
    rows = rows.ThenBy(r => string.IsNullOrEmpty(Convert.ToString(r[category])))
               .ThenBy(r => Convert.ToString(r[category]));
}

由于LINQ使用延迟执行,因此在您确实需要结果之前,不会评估您的查询。这就是为什么你可以像上面的例子那样在多个步骤中构建它。