web-dev-qa-db-ja.com

ラムダ式を使用してDataRowをフィルタリングするにはどうすればよいですか?

Col1 = "MyValue"の行のデータテーブルの行を検索するにはどうすればよいですか

私は何かを考えています

Assert.IsTrue(dataSet.Tables[0].Rows.
    FindAll(x => x.Col1 == "MyValue" ).Count == 1);

しかし、もちろんそれはうまくいきません!

14
Bob

LINQ to DataSets を使用してこれを行うことができます:

Assert.IsTrue(dataSet.Tables[0].AsEnumerable().Where(
    r => ((string) r["Col1"]) == "MyValue").Count() == 1);

注:Assertを呼び出さずにこれを行うこともできます。

dataSet.Tables[0].AsEnumerable().Where(
    r => ((string) r["Col1"]) == "MyValue").Single();

行の数が1と等しくない場合(つまり、Singleの呼び出し)、例外がスローされ、その未処理の例外が必要ですテストケースに失敗します。個人的には、セマンティックな意味が明確であるため、後者が好きです。

上記はさらに次のように要約できます。

dataSet.Tables[0].AsEnumerable().Single(
    r => ((string) r["Col1"]) == "MyValue");

さらに、 Field classDataRowExtensions method を利用して、フィールドへのタイプセーフなアクセスを簡素化できます(同様に DBNull を.NETの対応するnullに変換するという追加の利点を提供するため):

dataSet.Tables[0].AsEnumerable().Single(
    r => r.Field<string>("Col1") == "MyValue");
26
casperOne

これを行うには、データテーブルのSelectメソッド、またはテーブルのDefaultDataViewのFilterプロパティを使用できます。

Selectメソッドの場合:

var rows = dataSet.Tables[0].Select("Col1 = 'MyValue'");

DefaultViewフィルターの場合:

dataSet.Tables[0].DefaultView.Fitler = "Col1 = 'MyValue'";
foreach (var drv in dataSet.Tables[0].DefaultView)
{
    // Do your processing
}
6
davisoa

あなたはこれを試すことができます:

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

select ではなくラムダを使用する理由

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

記述したコードは、検索条件を満たす行が1つしかないことを確認します。実際に行が必要な場合は、AssertCountをドロップします

0
Yoni H