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 ?


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"));

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;

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.


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.


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.