LINQを使って2つのオブジェクトを結合する
今回は、データソースのオブジェクトを2つ用意して、LINQ を使って2つのオブジェクトを結合するやり方を解説します。
LINQ の結合に関する詳しい内容は、以下のマイクロソフト公式サイトを参照してください。
データソースの定義
今回用意するデータソースは、以下のようなイメージとなります。
項目 | 内容 |
---|---|
Id | 社員ID |
EmpName | 社員名 |
DepId | 部署ID |
項目 | 内容 |
---|---|
DepId | 部署ID |
DepName | 部署名 |
それぞれのデータソースの部署IDを紐づけて、2つのオブジェクトを結合します。
データソースの作成
上記のデータソースの定義を元に、オブジェクトを作成します。
1 2 3 4 5 6 7 8 9 10 11 12 |
// データソース(社員) var data1 = new[] { new { Id=1, EmpName="山田太郎", DepId=1 }, new { Id=2, EmpName="佐藤花子", DepId=2 }, new { Id=3, EmpName="鈴木一朗", DepId=1 } }; // データソース(部署) var data2 = new[] { new { DepId=1, DepName="営業" }, new { DepId=2, DepName="経理" } }; |
クエリ構文を使った結合
上記のオブジェクトをクエリ構文で結合する場合は、以下のように記述します。
from emp in data1
join dep in data2 on emp.DepId equals dep.DepId
select new { emp.EmpName, dep.DepName };
上記の例で使用している emp や dep の名称は、何でも構いませんが、何を表しているかが分かりやすい名称にします。
select句では、結合後の新しいオブジェクトの項目(社員名、部署名)を定義します。
メソッド構文を使った結合
メソッド構文で結合する場合は、以下のように記述します。
data1.Join(
data2,
emp => emp.DepId,
dep => dep.DepId,
(item1, item2) => new { item1.EmpName, item2.DepName }
);
Join()メソッドの引数の内容は、以下の通りです。
第2引数から第4引数は、ラムダ式で記載します。
第1引数:元のオブジェクトに結合するオブジェクト
第2引数:紐づける結合元の項目
第3引数:紐づける結合先の項目
第4引数:結合した新しいオブジェクトの項目(結合結果)
LINQでオブジェクトを結合したプログラムを作成する
これまでの内容を元に、実際に動作するプログラムを作成してみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
namespace LinqSample2 { internal class Program { static void Main(string[] args) { // データソース(社員) var data1 = new[] { new { Id=1, EmpName="山田太郎", DepId=1 }, new { Id=2, EmpName="佐藤花子", DepId=2 }, new { Id=3, EmpName="鈴木一朗", DepId=1 } }; // データソース(部署) var data2 = new[] { new { DepId=1, DepName="営業" }, new { DepId=2, DepName="経理" } }; // クエリ構文 var query1 = from emp in data1 join dep in data2 on emp.DepId equals dep.DepId select new { emp.EmpName, dep.DepName }; foreach (var x in query1) { Console.WriteLine($"{x.EmpName}:{x.DepName}"); } // メソッド構文 var query2 = data1.Join( data2, emp => emp.DepId, dep => dep.DepId, (item1, item2) => new { item1.EmpName, item2.DepName } ); foreach (var x in query2) { Console.WriteLine($"{x.EmpName}:{x.DepName}"); } } } } |
実行結果
山田太郎:営業
佐藤花子:経理
鈴木一朗:営業
山田太郎:営業
佐藤花子:経理
鈴木一朗:営業
記事一覧