C#

【C#】LINQでのJOINの使い方

LINQにおけるJOIN(結合)の使い方をまとめます。

【検証環境】.NET Framework 4.7.2

下記のクラスを例に使います

class Person
{
    public int PersonID { get; set; }
    public int Age { get; set; }
    public string Name { get; set; }
    //部署ID
    public string DepartmentID { get; set; }
    //課ID
    public string DivisionID { get; set; }
}
class Department
{
    //部署ID
    public string DepartmentID { get; set; }
    //課ID
    public string DivisionID { get; set; }
    //部署名
    public string DepartmentName { get; set; }
}
class Person_2
{
    public int Age { get; set; }
    public string Name { get; set; }
    public string DepartmentName { get; set; }
}

単一のキーで結合

var People = new List<Person>();
var Departments = new List<Department>();

//部署IDでJOIN
var join = People.Join(Departments,
                       p => p.DepartmentID,
                       d => d.DepartmentID,
                       (people, departments) => new
                       {
                           //型を指定しないので、匿名型になる(変数名は任意)
                           name = people.Name,
                           age = people.Age,
                           departmentName = departments.DepartmentName,
                       });

//匿名型のIEnumerableで返される
foreach (var item in join)
{
    Console.WriteLine($"名前:{item.name} 年齢:{item.age} 部署名:{item.departmentName}");
}

第1引数:結合したいシーケンスを指定
第2引数:対象のシーケンスの結合キーを指定
第3引数:第1引数で指定したシーケンスの結合キーを指定
第4引数:かっこでそれぞれの任意の変数名を指定して、結合した結果から取得したいオブジェクト生成処理を記述

複数のキーで結合

var join2 = People.Join(Departments,
                        p => (p.DepartmentID, p.DivisionID),    //もしくは p => new {p.DepartmentID, p.DivisionID},
                        d => (d.DepartmentID, d.DivisionID),    //もしくは d => new {d.DepartmentID, d.DivisionID},
                        (people, departments) => new
                        {
                            name = people.Name,
                            age = people.Age,
                            departmentName = departments.DepartmentName,
                        });

複数キーを指定する場合は、第2引数と第3引数でそれぞれの複数キーカンマ区切りで指定します。

匿名型でなく、指定した型で取得

var join3 = People.Join(Departments,
           p => p.DepartmentID,
           d => d.DepartmentID,
           (people, departments) => new Person_2()
           {
               Name = people.Name,
               Age = people.Age,
               DepartmentName = departments.DepartmentName,
           });

注意点として、newの後にEntityFrameWorkのEntityクラスを指定するとエラーになります。
匿名型もしくは通常のクラスでなければ射影することはできません。

エンジニアの転職ならこれ!

【第二新卒向け】マイナビジョブ20's

マイナビジョブ20'sは、20代・第二新卒・既卒向けの転職エージェントです。

▼こんな方におすすめ
・はじめて転職しようと思っている
・転職できるだけのスキルが自分にあるか不安
・手厚いサポートを受けたい

【フリーランス向け】 Midworks

Midworksは豊富な案件と「フリーランス」と「正社員」の良いとこ取りをした働き方を実現する手厚い保障が特徴です。

▼こんな方におすすめ
・現在正社員でフリーランスになろうか悩んでいる
・フリーランスとして働いているが、先行きが不安がある  (安定的な案件確保や保障など)
・自分の市場価値を知りたい、見合った案件で参画したい
・今後のキャリアビジョンを踏まえて案件を選びたい