Comment puis-je rechercher des lignes dans un datatable pour une ligne avec Col1 = "MyValue"
Je pense à quelque chose comme
Assert.IsTrue(dataSet.Tables[0].Rows.
FindAll(x => x.Col1 == "MyValue" ).Count == 1);
Mais bien sûr ça ne marche pas!
Vous pouvez utiliser LINQ to DataSets pour ce faire:
Assert.IsTrue(dataSet.Tables[0].AsEnumerable().Where(
r => ((string) r["Col1"]) == "MyValue").Count() == 1);
Notez que vous pouvez également le faire sans l'appel à Assert:
dataSet.Tables[0].AsEnumerable().Where(
r => ((string) r["Col1"]) == "MyValue").Single();
Si le nombre de lignes n'est pas égal à un (d'où l'appel de Single
), une exception sera levée et cette exception non gérée devrait échoue votre scénario de test. Personnellement, j'aime bien ce dernier, car il a un sens sémantique plus clair.
Ce qui précède peut être réduit à:
dataSet.Tables[0].AsEnumerable().Single(
r => ((string) r["Col1"]) == "MyValue");
En outre, vous pouvez tirer parti de la méthode Field
de la classe DataRowExtensions
pour simplifier l’accès au champ en toute sécurité (ainsi que l’avantage supplémentaire de convertir DBNull
en des équivalents nuls dans .NET):
dataSet.Tables[0].AsEnumerable().Single(
r => r.Field<string>("Col1") == "MyValue");
Pour ce faire, vous pouvez utiliser la méthode Select
de la table de données ou la propriété Filter de la DefaultDataView
de la table.
Pour la méthode Select
:
var rows = dataSet.Tables[0].Select("Col1 = 'MyValue'");
Pour le filtre DefaultView
:
dataSet.Tables[0].DefaultView.Fitler = "Col1 = 'MyValue'";
foreach (var drv in dataSet.Tables[0].DefaultView)
{
// Do your processing
}
Vous pouvez essayer ceci:
var b=datatable.AsEnumerable.where(p=> p.Field<string>
("column_name")=="desire_value").CopyToDataTable()
Pourquoi utiliser lambda et non select ?
DataRow[] foundRow = ( dataSet.Tables[0].Rows.Select("Col1 = 'MyValue'");
Le code que vous avez écrit vérifie qu’une seule ligne remplit votre condition de recherche. Si vous voulez réellement les lignes, supprimez les variables Assert
et Count
.