#はじめに
LINQで結合を行う際、複数キーを使用したいときについてのメモです。
間違いや勘違いに関しましてはご指摘いただけると幸いです。
テーブルのイメージ
PersonTable |
---|
string PersonID |
strijng Name |
int Age |
string TeamID |
int SmallTeamID |
TeamTable |
---|
string TeamID |
int SmallTeamID |
string TeamName |
複数のキーでの結合はSQLでは以下のように書きます。
SELECT p.PersonID AS PersonID, p.Name AS Name, t.TeamName AS TeamName
FROM PersonTable AS p
INNER JOIN TeamTable AS t
ON p.TeamID = t.TeamID
AND p.SmallTeamID = t.SmallTeamID;
LINQではJOINでのANDにあたるものがないため、結合キーを匿名型で生成します。
###クエリ式
var query = from p in PersonTable
join t in TeamTable
on new {p.TeamID, p.SmallTeamID}
equals new {p.TeamID, p.SmallTeamID}
where p.Age > 25
select new
{
PersonID = p.PersonID,
Name = p.Name,
TeamName = t.TeamName
};
###メソッド構文
var query = PersonTable
.Join(
TeamTable,
t => new { t.TeamID, t.SmallTeamID },
p => new { p.TeamID, p.SmallTeamID },
where p.Age > 25
(person, team) => new
{
UserID = person.UserID,
Name = person.UserName,
TeamName = team.DepartmentName
}
);
この結合キーは
{string TeamID, int SmallTeamID}
という構造になります。
この匿名型が一致する行で結合が行われます。