J'ai DataTable avec deux colonnes Author et Bookname .
Je veux vérifier si la valeur de chaîne donnée Author existe déjà dans le DataTable. Existe-t-il une méthode intégrée pour le vérifier, comme pour les tableaux array.contains?
Q: que se passe-t-il si nous ne connaissons pas les colonnes Headers et que nous voulons savoir si une valeur de cellule PEPSIexiste dans les colonnes des lignes? Je peux tout boucler pour le savoir, mais y a-t-il une meilleure façon? -
Ajoutez-les System.Data.DataSetExtensionsà la référence et using System.Linq;à l'utilisation de la classe
5377037
Parmi les deux solutions, laquelle serait la plus rapide?
Paul Alexander
1
@PaulAlexander: il n'y a pas de grande différence. Mais l'ancienne DataTable.Selectsyntaxe est limitée alors que LINQ peut utiliser le framework .NET complet ou des méthodes personnalisées. Donc, seulement si vous êtes bloqué sur .NET 2, vous devriez utiliser DataTable.Select, sinon je préférerais toujours LINQ
Tim Schmelter
Si vous vous souciez des performances et que vous disposez de grands ensembles de données, tbl.Select()est considérablement plus rapide que les autres approches.
HerrimanCoder
@TimSchmelter - Great Tim. Mais si l'utilisateur ne connaît pas le nom de la colonne mais veut toujours obtenir toutes les lignes qui correspondent à la valeur de recherche, comment cela peut-il être fait?
table.Any(t => t.Author == author);
Réponses:
Vous pouvez utiliser
LINQ-to-DataSet
avecEnumerable.Any
:String author = "John Grisham"; bool contains = tbl.AsEnumerable().Any(row => author == row.Field<String>("Author"));
Une autre approche consiste à utiliser
DataTable.Select
:DataRow[] foundAuthors = tbl.Select("Author = '" + searchAuthor + "'"); if(foundAuthors.Length != 0) { // do something... }
Oui, vous pouvez utiliser cette requête:
DataColumn[] columns = tbl.Columns.Cast<DataColumn>().ToArray(); bool anyFieldContainsPepsi = tbl.AsEnumerable() .Any(row => columns.Any(col => row[col].ToString() == "PEPSI"));
la source
System.Data.DataSetExtensions
à la référence etusing System.Linq;
à l'utilisation de la classeDataTable.Select
syntaxe est limitée alors que LINQ peut utiliser le framework .NET complet ou des méthodes personnalisées. Donc, seulement si vous êtes bloqué sur .NET 2, vous devriez utiliserDataTable.Select
, sinon je préférerais toujours LINQtbl.Select()
est considérablement plus rapide que les autres approches.Vous pouvez utiliser Linq. Quelque chose comme:
bool exists = dt.AsEnumerable().Where(c => c.Field<string>("Author").Equals("your lookup value")).Count() > 0;
la source
DataRow rw = table.AsEnumerable().FirstOrDefault(tt => tt.Field<string>("Author") == "Name"); if (rw != null) { // row exists }
ajoutez à votre clause using:
using System.Linq;
et ajouter :
aux références.
la source
Vous devriez pouvoir utiliser la méthode DataTable.Select () . Vous pouvez nous le faire comme ça.
if(myDataTable.Select("Author = '" + AuthorName.Replace("'","''") + '").Length > 0) ...
La fonction Select () renvoie un tableau de DataRows pour les résultats correspondant à l'instruction where.
la source
vous pouvez définir la base de données comme IEnumberable et utiliser linq pour vérifier si les valeurs existent. consultez ce lien
Requête LINQ sur Datatable pour vérifier si l'enregistrement existe
l'exemple donné est
var dataRowQuery= myDataTable.AsEnumerable().Where(row => ...
vous pouvez compléter où avec n'importe quel
la source