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クラスを指定するとエラーになります。
匿名型もしくは通常のクラスでなければ射影することはできません。