Sprawdź, czy wartość istnieje w dataTable?

92

Mam DataTable z dwiema kolumnami Autor i Bookname .

Chcę sprawdzić, czy podana wartość ciągu Autor już istnieje w DataTable. Czy jest jakaś wbudowana metoda sprawdzania tego, jak w przypadku tablic array.contains?

valterriann
źródło
8
LINQ? table.Any(t => t.Author == author);
Davio

Odpowiedzi:

206

Możesz używać LINQ-to-DataSetz Enumerable.Any:

String author = "John Grisham";
bool contains = tbl.AsEnumerable().Any(row => author == row.Field<String>("Author"));

Innym podejściem jest użycie DataTable.Select:

DataRow[] foundAuthors = tbl.Select("Author = '" + searchAuthor + "'");
if(foundAuthors.Length != 0)
{
    // do something...
}

P: co się stanie, jeśli nie znamy kolumn Nagłówki i chcemy sprawdzić, czy jakakolwiek wartość komórki PEPSIistnieje w kolumnach z wierszami? Mogę to wszystko zapętlić, aby się dowiedzieć, ale czy jest lepszy sposób? -

Tak, możesz użyć tego zapytania:

DataColumn[] columns = tbl.Columns.Cast<DataColumn>().ToArray();
bool anyFieldContainsPepsi = tbl.AsEnumerable()
    .Any(row => columns.Any(col => row[col].ToString() == "PEPSI"));
Tim Schmelter
źródło
Dodaj je System.Data.DataSetExtensionsdo odniesienia i using System.Linq;do korzystania z klasy
5377037
Które z tych dwóch rozwiązań byłoby szybsze?
Paul Alexander
1
@PaulAlexander: nie ma wielkiej różnicy. Ale stara DataTable.Selectskładnia jest ograniczona, podczas gdy LINQ może używać pełnej platformy .NET lub metod niestandardowych. Więc tylko jeśli utkniesz na .NET 2, powinieneś użyć DataTable.Select, w przeciwnym razie zawsze wolałbym LINQ
Tim Schmelter
Jeśli zależy Ci na wydajności i masz duże zbiory danych, tbl.Select()jest znacznie szybszy niż inne podejścia.
HerrimanCoder
@TimSchmelter - Świetny Tim. Ale jeśli użytkownik nie zna nazwy kolumny, ale nadal chce uzyskać wszystkie wiersze pasujące do wyszukiwanej wartości, jak można to zrobić?
Chandan Kumar
13

Możesz użyć Linq. Coś jak:

bool exists = dt.AsEnumerable().Where(c => c.Field<string>("Author").Equals("your lookup value")).Count() > 0;
mservidio
źródło
8
DataRow rw = table.AsEnumerable().FirstOrDefault(tt => tt.Field<string>("Author") == "Name");
if (rw != null)
{
// row exists
}

dodaj do swojej klauzuli using:

using System.Linq;

i dodaj :

System.Data.DataSetExtensions

do referencji.

Antonio Bakula
źródło
5

Powinieneś móc użyć metody DataTable.Select () . Możesz nam to w ten sposób.

if(myDataTable.Select("Author = '" + AuthorName.Replace("'","''") + '").Length > 0)
    ...

Funkcja Select () zwraca tablicę DataRows dla wyników zgodnych z instrukcją where.

Kibbee
źródło