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

C# DataTable-使用Lambda表达式的动态Linq OrderBy,c#,.net,linq,dynamic-linq,C#,.net,Linq,Dynamic Linq,我正在数据表中获取一组记录,并将其绑定到网格控件。在绑定之前,我将根据几个条件对数据进行排序。为了简单起见,我将解释一个测试场景 我有两个字段:类别和国家。我想先按类别,然后按国家对记录进行排序。但是这里的问题是我想把所有的空类别值推到末尾,然后根据字母顺序排序 为此,我正在做- var rows = dt.AsEnumerable() .OrderBy(r => string.IsNullOrEmpty(Convert.ToString(r["Category"])))

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

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

为此,我正在做-

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表达式根据字段动态排序记录?(将空值推到末尾)

我假设您所说的数组是一个字符串数组

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使用延迟执行,所以在实际需要结果之前不会对查询进行计算。这就是为什么您可以像上面的示例那样分多个步骤构造它。

Perfect。我已经试过了,但出于某种原因,我在附近发现了sytax错误。现在好了。