Col1 = "MyValue"の行のデータテーブルの行を検索するにはどうすればよいですか
私は何かを考えています
Assert.IsTrue(dataSet.Tables[0].Rows.
FindAll(x => x.Col1 == "MyValue" ).Count == 1);
しかし、もちろんそれはうまくいきません!
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
class で DataRowExtensions
method を利用して、フィールドへのタイプセーフなアクセスを簡素化できます(同様に DBNull
を.NETの対応するnullに変換するという追加の利点を提供するため):
dataSet.Tables[0].AsEnumerable().Single(
r => r.Field<string>("Col1") == "MyValue");
これを行うには、データテーブルの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
}
あなたはこれを試すことができます:
var b=datatable.AsEnumerable.where(p=> p.Field<string>
("column_name")=="desire_value").CopyToDataTable()
select ではなくラムダを使用する理由
DataRow[] foundRow = ( dataSet.Tables[0].Rows.Select("Col1 = 'MyValue'");
記述したコードは、検索条件を満たす行が1つしかないことを確認します。実際に行が必要な場合は、Assert
とCount
をドロップします