2011-11-30 16 views
5

Ho una tabella di due colonne contenente le colonne CustomerName ed Età. Ho tutti i dati in un DataTable. Voglio ordinarlo decrescente Età e quindi ogni gruppo di età è ordinato per nome. Quindi tutte le persone di età compresa tra 30 saranno ordinati alpabetically ed essere tra le liste di persone di età compresa tra 29 e 31 eccTabella di ordinamento C# di 2 colonne

ho:

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

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

Questo dovrebbe ordinare in base all'età. Non ho capito come ordinare ogni gruppo di età in ordine alfabetico, ma sopra è un'eccezione:

L'espressione filtro "Età" non viene valutata come termine booleano.

risposta

3

Come @adrift detto. È necessario inviare un'espressione filtro (che restituisce valore booleano) come primo argomento. Prova ad inviare null e una stringa vuota lì, forse Select ignorerà l'argomento. O dargli qualche espressione banale come 0 < 1. E poi nell'ordine per parte, puoi semplicemente separare diversi campi con le virgole: "Età Desc, Nome".

Ma ancora meglio, è necessario utilizzare classe DataView. Come questo:

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

Quindi è possibile impostare questa classe come origine dati per alcuni controlli, ecc tornerà righe in ordine corretto. Oppure puoi semplicemente usare foreach per scorrere le righe.

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

Il primo argomento su Select deve essere un'espressione di filtro, non un elenco di colonne da selezionare.

0

Questo perché il metodo DataTable.Select è per il filtro e l'istruzione di selezione non è simile a Selezione SQL.

Prova questo:

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

tuo selectstatement deve contenere l'espressione di filtro . Dai un'occhiata a this.

Così, il vostro selectExpression potrebbe essere

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

La selezione e l'ordinamento sono due cose diverse.

Si potrebbe utilizzare linq to dataset:

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

L'arg filtro può essere passato come nulla quindi essere applicato nessun riempimento del filtro, e in una sorta si può mettere il maggior numero di colonne che desiderate con/senza specificare direzione di ordinamento (il valore predefinito è asc). Dalla mia esperienza, su grande DataTables la selezione va più veloce dell'approccio LINQ.

0

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

Problemi correlati