C# LINQ to DataSetでDataTableから高速にデータを抽出する


LINQを使ってDataTableから高速抽出

はじめに

DataTableからデータを抽出する時、どんな方法を使っていますか。

やり方によっては処理時間がかかるものがありますよね。

よくやる方法だと

  • Selectメソッドをつかう
    var rows = dt.Select(“ID = ‘1’”)
    定番の遅いやつです。
  • じゃあインデックスを作ってからSelectメソッド
    dt.DefaultView.Sort = “ID”
    var rows = dt.Select(“ID = ‘1’”)
    速くなるけどSortするのに時間がかかります
    ついでにDataTableのデータ更新はもっと時間がかかります

という感じでしょうか。

で、早くするにはどうするかというとLINQを使うといいです。

DataTableからデータを絞り込む場合、以下のような書き方になります。

(LINQ To DataSet実装を利用します)

// DataTable dtが作成されているとして

DataRow[] rows = (
    from row in dt.AsEnumerable()
    let columnID = row.Field<string>("ID")
    where columnID == "1"
    orderby columnID
    select row
).ToArray();

こんな感じですね。ラムダ式と匿名関数の組み合わせなので

慣れていない人はとっつきにくいかもしれません。

複数の条件やLike文も可能です。

DataRow[] rows = (
    from row in dt.AsEnumerable()
    let columnID = row.Field<string>("ID")
    let columnName = row.Field<string>("NAME")
    where columnID == "1" || columnName.StartWith("田")
    orderby columnID
    select row
).ToArray();

 

LINQをつかって実行すると、なんとインデックスを作ったSelectより

早くなってました。

いったいどういう構造なのかさっぱりですが、

とにかくDataTableからデータを抽出するにはLINQを使うと

よいと思います。

 

LINQ式を動的に組むことも可能です。

これはまた後日。

 

 

 

 

 

 

 

 

 

 


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です