2016-03-19 8 views
-1

Ich habe eine Datentabelle (dt) mit 6 Spalten (S1, S2, S3 sind string und D1, D2, D3 sind double). Die Kombination der string Spalten (S1, S2, S3) meine PrimaryKey bilden:Wie Datentabelle sortieren und Primärschlüssel beibehalten?

dt.PrimaryKey = new DataColumn[] 
{ dt.Columns["S1"], dt.Columns["S2"], dt.Columns["S3"] }; 

Nun, ich möchte dt von D1, D2, D3 sortieren und als Datentabelle speichern. Hier ist, was ich habe:

DataView view = new DataView(dt); 
view.Sort = "D1, D2, D3"; 
dt = view.ToTable(); 

Das Problem ist, dt die Art und Weise sortiert wird, wollte ich durch meine PrimaryKeys verloren. Ich habe versucht, die 3. Zeile durch dt = view.Table.Copy(); zu ersetzen, die die PrimaryKeys behält, aber die Sortierung wird nicht funktionieren. Ich versuchte auch LINQ (How to sort DataTable based on multiple column?) zu verwenden und überprüfte diesen Trend (DataTable.DefaultView.Sort Doesn't Sort), aber keiner von ihnen arbeitete.

Mache ich etwas falsch? Jede Hilfe wird sehr geschätzt.

+1

Haben Sie versucht, die DefaultView.Sort-Eigenschaft NACH der view.Table.Copy festzulegen? – Steve

Antwort

1

Jede DataTable verfügt über eine DefaultView-Eigenschaft, mit der Sie eine Sortierung festlegen können, ohne eine Kopie Ihrer Haupttabelle erstellen zu müssen.

Wenn Sie die DefaultView.Sort Eigenschaft auf Ihre desidered Sortierreihenfolge und dann Schleife über die Standardansicht anstelle der Datatable Set erhalten Sie Ihre Zeilen in der genauen Reihenfolge

dt.DefaultView.Sort = "D1, D2, D3"; 
foreach(DataRowView dr in dt.DefaultView) 
    Console.WriteLine("D1=" + dr["D1"].ToString() + 
        ", D2=" + dr["D2"].ToString() + 
        ", D3=" + dr["D3"].ToString()); 

erforderlich Wenn Sie noch erstellen möchten neue Tabelle, dann müssen Sie die Primärschlüsselspalten in der neuen Tabelle erstellen .....

//Get the primarykey column names 
List<string> names = dt.PrimaryKey 
         .Cast<DataColumn>() 
         .Select(x => x.ColumnName) 
         .ToList(); 
// New table 
DataTable dt2 = dt.Copy(); 
// Get the array of datacolumns that match the name of the other table primary 
DataColumn[] keys = dt2.Columns 
         .Cast<DataColumn>() 
         .Where(x => names.Contains(x.ColumnName)) 
         .ToArray(); 

// Set the primary in the copied table 
dt2.PrimaryKey = keys; 
+0

Danke Steve. Ihr Code hat funktioniert, aber wenn ich diese sortierte Version wieder in 'dt' oder sogar in einer anderen Datentabelle speichern möchte, sollte ich sie überlesen? – EhsanK

+0

Wenn Sie das Ergebnis wieder der ursprünglichen dt-Variablen zuweisen, zerstören Sie es und erstellen ein neues. Dies ist natürlich möglich, aber wie Sie gesehen haben, verlieren Sie den PrimaryKey in der ursprünglichen Tabelle. Sie könnten jedoch einfach die Namen der Spalten im Primärschlüssel abrufen und sie in der neuen Tabelle neu erstellen. – Steve

+0

Beispiel hinzugefügt .... – Steve

0

der kürzere Weg ist:

var brandNewTable = dw.ToTable(); 
Verwandte Themen