2014-09-28 14 views
6

Mam datatable i wiersz. Chcę zaimportować wiersz do datatable tylko wtedy, gdy nie istnieje w datatable.Sprawdź, czy istnieje wiersz w DataTable?

Jak mogę to zrobić?

+2

Czy masz klucz w rzędzie (jak ty powinien)? – TaW

+0

Nie, nie mam, nie istnieje metoda taka jak "zawiera" lub "istnieje"? – Curious

+1

@ TamerMemili Posiada [Zawiera] (http://msdn.microsoft.com/en-us/library/0hc992ac (v = vs.110) .aspx), ale to będzie działać tylko z tabelami, które mają PK. –

Odpowiedz

10

Jeśli używasz zestawu danych wpisywanych, to znaczy zadeklarowany w czasie projektowania, "linq zawiera metodę" pobiera wpisaną DataRow. Domyślny IEqualityComparer porówna wszystkie wartości w DataRow. (Co jest normalnie bezużyteczne, ponieważ powinieneś mieć zdefiniowany klucz).

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

Is [rozszerzenie] (http://stackoverflow.com/a/34438198/2404470) jest pomocny? – xameeramir

+0

Cóż, "metoda LINQ zawiera", o której mowa powyżej, jest już rozszerzeniem metody. JEŚLI twoje rozszerzenie robiło coś pożytecznego, MOGA dodać trochę wartości do rozszerzenia zaimplementowanego przez MS. – S22

+0

Dodałbym ... musisz zdefiniować klucz podstawowy w tabeli, nawet jeśli nie używasz wpisanego zestawu danych. –

6

Możesz użyć LINQ, aby sprawdzić, czy wiersz jest obecny w datatable. Zastosuj to rozwiązanie i zastąp "id" kluczem podstawowym wiersza, dzięki któremu możesz jednoznacznie zidentyfikować wiersz w tabeli.

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

jeśli chcesz sprawdzić wszystkie cells w DataRow, można spróbować tej funkcji:

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

Nie odpowiada na pytanie – Grantly

3

można użyć Contains jak poniżej

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

Należy sprawdzić istnienie wiersza przez porównywanie kluczy podstawowych:

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

    return table.Rows.Contains(pk); 
}