【C#/LINQ】Join()を使って内部結合(inner join)を行う

投稿者: | 2012年5月8日

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】Join()を使って内部結合(inner join)を行う」への1件のフィードバック

  1. ピンバック: 【C#/LINQ】GroupJoinメソッドを使って外部結合を行う – ザワプロ!

コメントを残す

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