2010-05-26 13 views
29

Ich habe eine Datentabelle. Ich muss einen bestimmten Spaltenwert basierend auf der Benutzereingabe abrufen. Nehmen wir zum Beispiel an, dass die Datentabelle zwei Spalten CountryID und CountryName hat.Wie erhält man einen bestimmten Spaltenwert von einer DataTable?

Ich muss CountryID in der Datentabelle basierend auf dem Land der Benutzereingabe Land finden. Ich könnte gerade eine Verbindung mit DB öffnen und die Abfrage ausführen, wählen Sie countryID aus Country aus, wo countryName = @userput. Kann ich das trotzdem auf der Datentabelle machen?

Antwort

59
string countryName = "USA"; 
DataTable dt = new DataTable(); 
int id = (from DataRow dr in dt.Rows 
       where (string)dr["CountryName"] == countryName 
       select (int)dr["id"]).FirstOrDefault(); 
+0

natürlich würde die 'DataTable' aus Ihrem DB –

+0

Schleifen bestehen .. sehr glatt! Danke! –

0

Ich nehme an, Sie ein Dataview-Objekt stattdessen verwenden könnte, würde dies dann können Sie die Vorteile der RowFilter Eigenschaft nehmen, wie hier erklärt:

http://msdn.microsoft.com/en-us/library/system.data.dataview.rowfilter.aspx

private void MakeDataView() 
{ 
    DataView view = new DataView(); 

    view.Table = DataSet1.Tables["Countries"]; 
    view.RowFilter = "CountryName = 'France'"; 
    view.RowStateFilter = DataViewRowState.ModifiedCurrent; 

    // Simple-bind to a TextBox control 
    Text1.DataBindings.Add("Text", view, "CountryID"); 
} 
+0

Danke, ich habe es noch nicht ausprobiert. Kann ich den Wert in eine Variable verschieben, anstatt an ein Textfeld zu binden? – peace

+1

Nicht getestet, aber Sie könnten versuchen: Zeichenfolge CountryName = view.Table.Rows [0] ["CountryName"]. ToString(); – Dal

16
foreach (DataRow row in Datatable.Rows) 
{ 
    if (row["CountryName"].ToString() == userInput) 
    { 
     return row["CountryID"]; 
    } 
} 

Während dies nicht kompilieren kann direkt sollten Sie die Idee bekommen, auch bin ich mir sicher, es wäre weit überlegen, die Abfrage über SQL zu tun, da eine riesige Datentabelle eine lange Zeit braucht, um alle Zeilen zu durchlaufen.

+0

Einfach und direkt auf den Punkt, aber wie Sie gesagt haben, kann dies in der späteren Zukunft viel kosten. – peace

+0

Alles in allem wird nichts effizienter sein als nur mit SQL, LINQ to Datatables und Datatables/Dataviews müssen alle Datensätze in den Speicher laden und dann abfragen – Jimmy

+0

Eine andere Option ist einfach nur mit linq zu SQL – Jimmy

1

Datatables verfügen über eine .Select-Methode, die ein Zeilenarray gemäß den von Ihnen angegebenen Kriterien zurückgibt. Etwas wie folgt aus:

Dim oRows() As DataRow 

oRows = dtCountries.Select("CountryName = '" & userinput & "'") 

If oRows.Count = 0 Then 
    ' No rows found 
Else 
    ' At least one row found. Could be more than one 
End If 

Natürlich, wenn userinput "Zeichen enthält, wäre es eine Ausnahme auslösen (wie wenn Sie die Datenbank abfragen). Sie sollten den Zeichen entkommen (ich benutze eine Funktion, um das zu tun).

8

Ich schlage vor, eine solche Art und Weise basierend auf Erweiterungsmethoden:

IEnumerable<Int32> countryIDs = 
    dataTable 
    .AsEnumerable() 
    .Where(row => row.Field<String>("CountryName") == countryName) 
    .Select(row => row.Field<Int32>("CountryID")); 

System.Data.DataSetExtensions.dll muss referenziert werden.

+1

Dies ist genau das, was ich gesucht habe, danke! Fast hätte ich Ihren letzten Kommentar über die Referenz verpasst - vielen Dank auch dafür. – kwill

Verwandte Themen