【C#/LINQ】Joinメソッドを使って内部結合を行う

By | 2012年5月8日

LINQのJoinメソッドを使って、SQLの内部結合に相当するデータ操作を行ってみよう。
以下のようなテーブルデータがあるとして、それを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

クエリ式は、タイプ数は少なく済むのだが、今ひとつ可読性に優れないこともあって、
最近は全く使わなくなってしまった…。


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です