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メソッドを使って外部結合を行う – ザワプロ!