2011-11-30 30 views
5

Tengo una tabla de dos columnas que contiene CustomerName y columnas de edad. Tengo todos los datos en una DataTable. Quiero ordenarlo descendiendo la edad y luego cada grupo de edad se ordena por nombre. Así que todas las personas de 30 años se ordenarán alpabetically y estar entre las listas de personas 29 y 31, etc.C# tabla de clasificación por 2 columnas

años que tengo:

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

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

Esto debería ordenar por edad. No he descubierto cómo ordenar alfabéticamente cada grupo de edad, pero lo anterior arroja una excepción:

La expresión de filtro 'Edad' no se evalúa con un término booleano.

Respuesta

3

Como @adrift dijo. Debe enviar una expresión de filtro (que evalúa a boolean) como primer argumento. Intente enviar null y una cadena vacía allí, tal vez Select ignorará el argumento. O déle una expresión trivial como 0 < 1. Y luego, en el orden por partes, puede separar varios campos por comas: "Desc Edad, Nombre".

Pero aún mejor, debería usar la clase DataView. De esta manera:

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

entonces se puede establecer esta clase como un origen de datos para algunos controles, etc. volverá filas en el orden correcto. O simplemente puede usar foreach para iterar sobre las filas.

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

El primer argumento para Select debe ser una expresión de filtro, no una lista de columnas para seleccionar.

0

Esto se debe a que el método DataTable.Select es para filtrar y su instrucción de selección no es como una Selección de SQL.

Prueba esto:

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

Su selectStatement debe contener la expresión de filtro . Eche un vistazo al this.

lo tanto, su selectExpression podría ser

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

Seleccionar y ordenar son dos cosas diferentes.

Usted podría utilizar linq to dataset:

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

El arg filtro se puede pasar como nula por lo que se aplicará ningún relleno de filtro, y en el Orden podrá poner tantas columnas que desea con/sin especificar dirección de ordenación (el valor predeterminado es asc). Desde mi experiencia, en el gran DataTables el Select va más rápido que el enfoque LINQ.

0

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

Cuestiones relacionadas