2014-09-25 212 views
0

我在DataTable中获取记录的集合并将其绑定到网格控件。在绑定它之前,我正在基于几个条件对数据进行排序。为了简洁起见,我将解释一个测试场景。DataTable - 使用Lambda表达式的动态Linq OrderBy

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

对于我正在做的 -

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

我假设你所说的数组是字符串数组。

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使用延迟执行,您的查询不会被评估,直到你真的需要结果。这就是为什么你可以像上面的例子一样在多个步骤中构建它。

+0

完美。我已经尝试过,但由于某种原因,我在ThenBy附近收到了一个sytax错误。现在很好。 – NLV 2014-09-26 14:52:22