C#3.0 になって、DataTable から DataRow を抽出するときに LINQ を良く利用するけど、
var result = from row in table.Rows where 1000 < (decimal)row["amount"] select row;
これでビルドエラーになるのが個人的に嫌。一見、ビルドが通っても良さそうだけど、DataRowCollection が IEnumerable
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); } }
はい、ただの拡張メソッドです。