web-dev-qa-db-fra.com

Comment utiliser les expressions lambda pour filtrer DataRows?

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!

13
Bob

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

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
}
6
davisoa

Vous pouvez essayer ceci:

var b=datatable.AsEnumerable.where(p=> p.Field<string>   
("column_name")=="desire_value").CopyToDataTable()
3
Sougata Mukherjee

Pourquoi utiliser lambda et non select ?

  DataRow[] foundRow = ( dataSet.Tables[0].Rows.Select("Col1 = 'MyValue'");
2
Nix

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.

0
Yoni H