Verifique se existe valor em dataTable?

89

Eu tenho DataTable com duas colunas Author e Bookname .

Quero verificar se o valor de string fornecido Author já existe na DataTable. Existe algum método integrado para verificar isso, como para Arrays array.contains ?

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

Respostas:

199

Você pode usar LINQ-to-DataSetcom Enumerable.Any:

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

Outra abordagem é usar DataTable.Select:

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

P: e se não conhecermos os cabeçalhos das colunas e quisermos descobrir se PEPSIexiste algum valor de célula em alguma coluna de rows? Posso fazer um loop de tudo para descobrir, mas existe uma maneira melhor? -

Sim, você pode usar esta consulta:

DataColumn[] columns = tbl.Columns.Cast<DataColumn>().ToArray();
bool anyFieldContainsPepsi = tbl.AsEnumerable()
    .Any(row => columns.Any(col => row[col].ToString() == "PEPSI"));
Tim Schmelter
fonte
Adicione-os System.Data.DataSetExtensionspara referência e using System.Linq;para usar a classe
5377037
Das duas soluções, qual seria mais rápida?
Paul Alexander
1
@PaulAlexander: não há grande diferença. Mas a DataTable.Selectsintaxe antiga é limitada, enquanto o LINQ pode usar a estrutura .NET completa ou métodos personalizados. Portanto, você deve usar apenas se estiver preso ao .NET 2 DataTable.Select, caso contrário, eu sempre preferiria LINQ
Tim Schmelter
Se você se preocupa com o desempenho e tem grandes conjuntos de dados, tbl.Select()é dramaticamente mais rápido do que as outras abordagens.
HerrimanCoder
@TimSchmelter - Ótimo Tim. Mas se o usuário não souber o nome da coluna, mas ainda quiser obter todas as linhas que correspondem ao valor da pesquisa, como isso pode ser feito?
Chandan Kumar
13

Você pode usar o Linq. Algo como:

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

adicione à sua cláusula using:

using System.Linq;

e adicione :

System.Data.DataSetExtensions

às referências.

Antonio Bakula
fonte
5

Você deve ser capaz de usar o método DataTable.Select () . Você pode nos assim.

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

A função Select () retorna uma matriz de DataRows para os resultados correspondentes à instrução where.

Kibee
fonte
0

você pode definir o banco de dados como IEnumberable e usar linq para verificar se os valores existem. verifique este link

LINQ Query on Datatable para verificar se existe registro

o exemplo dado é

var dataRowQuery= myDataTable.AsEnumerable().Where(row => ...

você poderia complementar onde com qualquer

Blast_dan
fonte