プログラマーな日々

プログラマーをやっています。好きなツール:WorkFlowy、好きな言語:C#、好きなサービス:Backlog、好きなAWS:AWS Lambda。

DataTableのJOINの代わりにLINQ to DataSetを使う

DataTableは便利ですが、JOINの機能がありません。そのため、以下のような方法を使って擬似的にJOINを実現するしかありませんでした。

DataColumn.Expression プロパティ (System.Data)
行のフィルタ処理、列内の値の計算、または集約列の作成に使用する式を取得または設定します。

親子のリレーションシップの参照

列名の前に Parent を付けて、式の中で親テーブルを参照できます。たとえば、Parent.Price は、親テーブル内の Price という名前の列を参照します。

列名の前に Child を付けて、式の中で子テーブル内の列を参照できます。ただし、子のリレーションシップから複数の行が返される可能性があるため、集約関数には子への参照を含める必要があります。たとえば、Sum(Child.Price) は、子テーブルの Price という名前の列の合計を返します。

しかし、C#3.0以上ならLINQ to DataSetでJOINできます。こんな感じです。

string userID = "900000";

using (UserDataSet dataSet = GetUserDataSet()) {
var query = from user in dataSet.UserInfo
            join master in dataSet.UserMaster
                on user.UserID equals master.UserID
            where user.UserID == userID
            select master.UserDispName;
}

2011/07/11追記

事前に全てのDataTableにFillすることになるので、LINQ to SQLを使った方がパフォーマンス面で有利かもしれません。(未確認)