LINQのJoin()メソッドを使って、SQLの内部結合(inner join)に相当するデータ操作を行ってみよう。
以下のようなテーブルデータがあるとして、それをLINQで結合してみることにする。
Persons
| Id | Name | Age | JobId |
|---|---|---|---|
| 1 | John | 56 | 1 |
| 2 | Mike | 23 | 1 |
| 3 | Ken | 64 | 2 |
| 4 | Alice | 41 | 4 |
| 5 | Tom | 22 | 3 |
Jobs
| Id | Name |
|---|---|
| 1 | Programmer |
| 2 | Engineer |
| 3 | Sportman |
| 4 | King |
| 5 | Slave |
C#のプログラムは以下のようになる。
Program.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication1
{
class Person
{
public int Id { get; set; }
public String Name{ get; set; }
public int Age { get; set; }
public int JobId { get; set; }
}
class Job
{
public int Id { get; set; }
public String Name { get; set; }
}
class Program
{
static void Main(string[] args)
{
var persons = new Person[]{
new Person{ Id = 1,Name = "John", Age = 56, JobId = 1},
new Person{ Id = 2,Name = "Mike", Age = 23, JobId = 1},
new Person{ Id = 3,Name = "Ken", Age = 64, JobId = 2},
new Person{ Id = 4,Name = "Alice", Age = 41, JobId = 4},
new Person{ Id = 5,Name = "Tom", Age = 22, JobId = 3},
};
var jobs = new Job[] {
new Job{ Id = 1, Name = "Programmer" },
new Job{ Id = 2, Name = "Engineer" },
new Job{ Id = 3, Name = "Sportman" },
new Job{ Id = 4, Name = "King" },
new Job{ Id = 5, Name = "Slave" }
};
var query =
persons.Join(jobs, p => p.JobId, j => j.Id, (p, j) => new {
PersonId = p.Id,
Name = p.Name,
Age = p.Age,
JobName = j.Name
});
foreach (var j in query)
{
Console.WriteLine("PersonId:{0}\tName:{1}\tAge:{2}\tJob:{3}", j.PersonId, j.Name, j.Age, j.JobName);
}
}
}
}
プログラムの実行結果は以下のようになった。
PersonId:1 Name:John Age:56 Job:Programmer
PersonId:2 Name:Mike Age:23 Job:Programmer
PersonId:3 Name:Ken Age:64 Job:Engineer
PersonId:4 Name:Alice Age:41 Job:King
PersonId:5 Name:Tom Age:22 Job:Sportman
続行するには何かキーを押してください . . .
参考に、以上の操作をクエリ式で書いた場合とSQLで書いた場合について示す。
クエリ式
var query =
from p in persons
join j in jobs on p.JobId equals j.Id
select new{ PersonId=p.Id, Name=p.Name, Age = p.Age, JobName = j.Name };
SQL
SELECT
Persons.Id AS PersonId,
Persons.Name AS Name,
Persons.Age AS Age,
Jobs.Name AS JobName
FROM
Persons
INNER JOIN
Jobs ON Persons.JobId = Jobs.Id
クエリ式は、タイプ数は少なく済むのだが、今ひとつ可読性に優れないこともあって、
最近は全く使わなくなってしまった…。
ピンバック: 【C#/LINQ】GroupJoinメソッドを使って外部結合を行う – ザワプロ!