2011-11-30 8 views
5

Tôi có một bảng hai cột chứa cột CustomerName và Age. Tôi có tất cả dữ liệu trong một DataTable. Tôi muốn sắp xếp nó theo Độ tuổi giảm dần và sau đó mỗi nhóm tuổi được sắp xếp theo tên. Vì vậy, tất cả mọi người trong độ tuổi 30 sẽ được sắp xếp alpabetically và được giữa danh sách những người trong độ tuổi 29 và 31, vvC# sắp xếp bảng theo 2 cột

tôi có:

string selectStatement = "Age"; 
string sortStatement = "Age DESC" 

var rows = table.Select(selectStatement, sortStatement); 

này nên sắp xếp theo độ tuổi. Tôi đã không tìm ra cách sắp xếp từng nhóm tuổi theo thứ tự bảng chữ cái nhưng ở trên ném một ngoại lệ:

Biểu thức lọc 'Tuổi' không đánh giá theo thuật ngữ Boolean.

Trả lời

3

Giống như @adrift nói. Bạn nên gửi biểu thức lọc (đánh giá boolean) làm đối số đầu tiên. Cố gắng gửi null và một chuỗi rỗng ở đó, có thể Chọn sẽ bỏ qua đối số. Hoặc cung cấp cho nó một số biểu hiện tầm thường như 0 < 1. Và sau đó theo thứ tự một phần, bạn chỉ có thể tách biệt một số trường bằng dấu phẩy: "Độ tuổi, Tên".

Nhưng tốt hơn nữa, bạn nên sử dụng lớp DataView. Như thế này:

var dt = new DataTable(); // your data. 
var view = new DataView(dt); 
view.Sort = "Age desc, Name asc"; 

Sau đó, bạn có thể đặt lớp này làm nguồn dữ liệu cho một số điều khiển, v.v. Hoặc bạn chỉ có thể sử dụng foreach để lặp qua các hàng.

foreach (DataRowView dr in view) 
{ 
    //do what you like 
} 
1

Đối số đầu tiên cho Select phải là biểu thức lọc, không phải danh sách cột để chọn.

0

Đó là vì phương pháp DataTable.Select là để lọc và câu lệnh chọn của bạn không giống như Chọn SQL.

Hãy thử điều này:

table.DefaultView.Sort = "Age DESC"; 
0

bạn selectStatement phải có các biểu hiện lọc. Hãy xem this.

Vì vậy, selectExpression của bạn có thể

string selectStatement = "Age > 0"; //if all people required 
1

Chọn và sắp xếp là hai thứ khác nhau.

Bạn có thể sử dụng linq to dataset:

var rows = table.AsEnumerable().OrderByDescending(row => row.Field<int>("Age")). 
           ThenBy(row => row.Field<string>("Name")); 
0

Các arg bộ lọc có thể được thông qua như null do đó không có bộ lọc điền được áp dụng, và trong các loại bạn có thể đặt nhiều cột mà bạn muốn có/không có quy định cụ thể theo hướng loại (mặc định là asc). Từ kinh nghiệm của tôi, trên số lớn DataTables Chọn nhanh hơn phương pháp LINQ.

0

DataView oDataSet; oDataSet.Tables [0] .DefaultView.Sort = "Column1 ASC";