webentwicklung-frage-antwort-db.com.de

Wie verwende ich Lambda-Ausdrücke zum Filtern von DataRows?

Wie kann ich mit Col1 = "MyValue" Zeilen in einer Datentabelle nach einer Zeile durchsuchen?

Ich denke so etwas wie

Assert.IsTrue(dataSet.Tables[0].Rows.
    FindAll(x => x.Col1 == "MyValue" ).Count == 1);

Aber das geht natürlich nicht!

13
Bob

Sie können LINQ to DataSets verwenden, um dies auszuführen:

Assert.IsTrue(dataSet.Tables[0].AsEnumerable().Where(
    r => ((string) r["Col1"]) == "MyValue").Count() == 1);

Beachten Sie, dass Sie dies auch ohne den Aufruf von Assert tun können:

dataSet.Tables[0].AsEnumerable().Where(
    r => ((string) r["Col1"]) == "MyValue").Single();

Wenn die Anzahl der Zeilen nicht gleich eins ist (daher der Aufruf von Single), wird eine Ausnahme ausgelöst, und die nicht behandelte Ausnahme sollte Ihren Testfall nicht bestehen. Ich persönlich mag das letztere, da es eine klarere semantische Bedeutung hat.

Das oben genannte kann weiter reduziert werden auf:

dataSet.Tables[0].AsEnumerable().Single(
    r => ((string) r["Col1"]) == "MyValue");

Darüber hinaus können Sie die Field-Methode in der DataRowExtensions-Klasse verwenden, um den typsicheren Zugriff auf das Feld zu vereinfachen (und zusätzlich den Vorteil der Konvertierung von DBNull in null-Gegenstücke in .NETZ):

dataSet.Tables[0].AsEnumerable().Single(
    r => r.Field<string>("Col1") == "MyValue");
26
casperOne

Sie können dazu die Methode Select der Datentabelle oder die Filtereigenschaft der Variable DefaultDataView für die Tabelle verwenden.

Für die Select-Methode: 

var rows = dataSet.Tables[0].Select("Col1 = 'MyValue'");

Für den DefaultView Filter:

dataSet.Tables[0].DefaultView.Fitler = "Col1 = 'MyValue'";
foreach (var drv in dataSet.Tables[0].DefaultView)
{
    // Do your processing
}
6
davisoa

Sie können dies versuchen:

var b=datatable.AsEnumerable.where(p=> p.Field<string>   
("column_name")=="desire_value").CopyToDataTable()
3

Warum Lambda und nicht select verwenden?

  DataRow[] foundRow = ( dataSet.Tables[0].Rows.Select("Col1 = 'MyValue'");
2
Nix

Der von Ihnen geschriebene Code prüft, ob nur eine Zeile Ihre Suchbedingung erfüllt. Wenn Sie die Zeilen wirklich haben möchten, löschen Sie die Variablen Assert und Count.

0
Yoni H