読者です 読者をやめる 読者になる 読者になる

LINQ と DataTable

.net

C#3.0 になって、DataTable から DataRow を抽出するときに LINQ を良く利用するけど、

var result = from row in table.Rows
             where 1000 < (decimal)row["amount"]
             select row;

これでビルドエラーになるのが個人的に嫌。一見、ビルドが通っても良さそうだけど、DataRowCollection が IEnumerable を実装していないので 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);
    }
}

はい、ただの拡張メソッドです。