2014-09-28 24 views
6

Ich habe eine Datentabelle und eine Zeile. Ich möchte die Zeile nur in die Datentabelle importieren, wenn sie nicht in der Datentabelle vorhanden ist.Prüfen, ob in DataTable eine Zeile existiert?

Wie kann ich das tun?

+2

Haben Sie einen Schlüssel in der Reihe haben (wie Sie sollte)? – TaW

+0

Nein, ich habe keine, gibt es nicht eine Methode wie "enthält" oder "existiert"? – Curious

+1

@TamerMemili Es hat [Enthält] (http://msdn.microsoft.com/en-us/library/0hc992ac (v = vs.110) .aspx), aber das funktioniert nur mit Tabellen, die PK haben. –

Antwort

10

Wenn Sie eine typisierte Datasets verwenden, das heißt In der Entwurfszeit deklariert, dauert die Methode "linq Contains" eine typisierte DataRow. Der Standard IEqualityComparer vergleicht alle Werte in der DataRow. (Was normalerweise nutzlos ist, da Sie einen Schlüssel definiert haben sollten).

DataSet1 ds = new DataSet1(); 
DataSet1.DataTable1Row row = ds.DataTable1.AddDataTable1Row(bla, bla); 
bool exists = ds.DataTable1.Contains(row); 
+0

Ist [eine Erweiterung] (http://stackoverflow.com/a/34438198/2404470) hilfreich? – xameeramir

+0

Nun, die oben erwähnte Methode "LINQ contains" ist bereits eine Methodenerweiterung. WENN Ihre Erweiterung etwas Nützliches getan hätte, hätte sie der von MS implementierten Erweiterung einen gewissen Wert hinzugefügt. – S22

+0

Ich würde hinzufügen .. Sie müssen einen Primärschlüssel in der Tabelle definiert haben, auch wenn Sie kein typisiertes Dataset verwenden. –

6

Sie können LINQ verwenden, um zu überprüfen, ob eine Zeile in der Datentabelle vorhanden ist. Folgen Sie dieser Lösung und ersetzen Sie "id" durch den Primärschlüssel Ihrer Zeile, mit dem Sie eine Zeile in einer Tabelle eindeutig identifizieren können.

DataRow dr = null; // assign your DR here 
DataTable dt = new DataTable(); // assign Datatable instance here. 
var k = (from r in dt.Rows.OfType<DataRow>() where r["id"].ToString() == dr["id"].ToString() select r).FirstOrDefault(); 
if(k != null) 
{ // Row is present } 
7

, wenn Sie wollen, dass alle zu überprüfen, die cells in einem DataRow, können Sie diese Funktion versuchen:

bool ContainDataRowInDataTable(DataTable T,DataRow R) 
{ 
    foreach (DataRow item in T.Rows) 
    { 
     if (Enumerable.SequenceEqual(item.ItemArray, R.ItemArray)) 
      return true; 
    } 
    return false; 
} 
0
if (Datatable1.Rows[NumOfRow].ToString().Deleted == "Deleted") 
+3

Geht nicht auf die Frage ein – Grantly

3

können Sie Contains verwenden als unten

if(DataTable.Columns.Contains("RowName")) 
{ 
    //Do some stuffs here 
} 
0

Sie sollten Zeile Existenz durch den Vergleich Primärschlüssel überprüfen:

static bool RowExists(DataTable table, DataRow row) 
{ 
    var pk = table.PrimaryKey 
       .Select(column => row[column, DataRowVersion.Original]) 
       .ToArray(); 

    return table.Rows.Contains(pk); 
} 
Verwandte Themen