C#3.0 になって、DataTable から DataRow を抽出するときに LINQ を良く利用するけど、
var result = from row in table.Rows
where 1000 < (decimal)row["amount"]
select row;
これでビルドエラーになるのが個人的に嫌。一見、ビルドが通っても良さそうだけど、DataRowCollection が IEnumerable<T> を実装していないので NG。
DataTable で LINQ を使う場合は次のように書かないといけない書けばいい。
var result = from row in table.AsEnumerable()
where 1000 < (decimal)row["amount"]
select row;
でも、AsEnumerable メソッドを呼び出す必要があるなんて格好悪い。
理想はこれ。
var result = from row in table
where 1000 < (decimal)row["amount"]
select row;
このコードは当然、動きません。
だが、こっちの構文ならいける!
var result = table.Where(row => 1000 < (decimal)row["amount"])
.Select(row => row);
種明かしはこれ。
public static class MyDataTableExtensions
{
public static EnumerableRowCollection<DataRow> Where(
this DataTable table,
Func<DataRow, bool> predicate)
{
return table.AsEnumerable().Where<DataRow>(predicate);
}
}
はい、ただの拡張メソッドです。