Verificare se il valore esiste in dataTable?


91

Ho DataTable con due colonne Author e Bookname .

Voglio verificare se il valore di stringa specificato Author esiste già in DataTable. C'è un metodo integrato per controllarlo, come per gli array array.contains?


8
LINQ? table.Any(t => t.Author == author);
— Davio

Risposte:


206

Puoi usare LINQ-to-DataSetcon Enumerable.Any:

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

Un altro approccio consiste nell'utilizzare DataTable.Select:

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

D: cosa succede se non conosciamo le intestazioni delle colonne e vogliamo scoprire se esiste un valore di cella PEPSIin qualsiasi colonna delle righe? Posso ripetere tutto per scoprirlo, ma c'è un modo migliore? -

Sì, puoi utilizzare questa query:

DataColumn[] columns = tbl.Columns.Cast<DataColumn>().ToArray();
bool anyFieldContainsPepsi = tbl.AsEnumerable()
    .Any(row => columns.Any(col => row[col].ToString() == "PEPSI"));

Aggiungili System.Data.DataSetExtensionsper fare riferimento e using System.Linq;utilizzare la classe
— 5377037

Tra le due soluzioni, quale sarebbe più veloce?
— Paul Alexander

1
@PaulAlexander: non c'è una grande differenza. Ma la vecchia DataTable.Selectsintassi è limitata mentre LINQ può utilizzare il framework .NET completo o metodi personalizzati. Quindi solo se sei bloccato su .NET 2 dovresti usare DataTable.Select, altrimenti preferirei sempre LINQ
— Tim Schmelter

Se ti interessano le prestazioni e disponi di set di dati di grandi dimensioni, tbl.Select()è notevolmente più veloce rispetto agli altri approcci.
— HerrimanCoder

@TimSchmelter - Great Tim. Ma se l'utente non conosce il nome della colonna ma desidera comunque ottenere tutte le righe che corrispondono al valore di ricerca, come può essere fatto?
— Chandan Kumar

13

Puoi usare Linq. Qualcosa di simile a:

bool exists = dt.AsEnumerable().Where(c => c.Field<string>("Author").Equals("your lookup value")).Count() > 0;

8
DataRow rw = table.AsEnumerable().FirstOrDefault(tt => tt.Field<string>("Author") == "Name");
if (rw != null)
{
// row exists
}

aggiungi alla tua clausola using:

using System.Linq;

e aggiungi :

System.Data.DataSetExtensions

ai riferimenti.


5

Dovresti essere in grado di utilizzare il metodo DataTable.Select () . Puoi usarlo in questo modo.

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

La funzione Select () restituisce un array di DataRows per i risultati che corrispondono all'istruzione where.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.