user1186850
user1186850

Reputation: 133

How to sort datatable with multi column using LINQ

I have a Datatable contain n columns. I want to sort n columns in the datatable by LINQ but I don't know how to do that. I sorted successfully with 1 columns but I didn't with multi columns

Ex:

Dictionary<string, string> dict = Dictionary<string, string>
dict.Add("column_1", "asc");
dict.Add("column_2", "asc");
dict.Add("column_3", "asc");
...
dict.Add("column_n", "asc");
var Rows = from row in datatable.AsEnumerable()
           orderby n1 acsending  (I need loop to add all columns in Dictionary here to sort multi columns)
           select row 

How to loop n columns to add in orderby operator.

My problem is user have a array contain name of columns to sort and I need loop a array to add columns name in operator orderby to sort multi column

PS: My English is not good. Sorry

Thanks Nguyen

Upvotes: 5

Views: 20029

Answers (4)

Steffen Timm
Steffen Timm

Reputation: 91

To use the dictionary as order definition you can use the following:

Dictionary<string, string> dict = new Dictionary<string, string>();
dict.Add("col1", "asc");
dict.Add("col2", "desc");

DataTable datatable = new DataTable();
datatable.Columns.Add("col1");
datatable.Columns.Add("col2");
datatable.Rows.Add(new[] {"a", "1"});
datatable.Rows.Add(new[] {"b", "2"});
datatable.Rows.Add(new[] {"a", "5"});

datatable.DefaultView.Sort = 
                  String.Join(",", dict.Select(x => x.Key + " " + x.Value).ToArray());
datatable = datatable.DefaultView.ToTable();

Upvotes: 3

Hugh
Hugh

Reputation: 454

Try comma seperating the order by columns

var Rows = from row in datatable.AsEnumerable()
       orderby n1 acsending, n2
       select row 

Upvotes: 0

Adam
Adam

Reputation: 2440

list.OrderBy(x => x.att1).ThenByDescending(x => x.att2);

Could be ThenByAscending. Using a lambda in this situation would be cleaner to read as well.

Upvotes: 3

Steffen Timm
Steffen Timm

Reputation: 91

datatable.AsEnumerable().OrderBy(c => c[0]).ThenBy(c => c[1]);

This will order the rows by the first and the second column

Upvotes: 3

Related Questions