C#プチリファレンス

C# LINQ(クエリ式 - 結合)

クエリ式で記述するLINQの結合のサンプルです。

ラムダ式のサンプルはこちらをご覧ください。


このページのサンプルは以下データを元にしています。

【データクラス(社員)】
class Syain
{
    public Syain(string id, string name, int age, string dept)
    {
        this.id = id;
        this.name = name;
        this.age = age;
        this.dept = dept;
    }

    public string id   { get; set; }  // 社員ID
    public string name { get; set; }  // 名前
    public int    age  { get; set; }  // 年齢
    public string dept { get; set; }  // 部署コード
}

【データクラス(部署)】
class Dept
{
  public Dept(string deptCd, string deptNm)
  {
    this.deptCd = deptCd;
    this.deptNm = deptNm;
  }

  public string deptCd { get; set; }  // 部署コード
  public string deptNm { get; set; }  // 部署名
}
(List生成)
var syainList = new List<Syain>();
syainList.Add(new Syain("002", "山田", 35, "EI"));
syainList.Add(new Syain("004", "鈴木", 28, "EI"));
syainList.Add(new Syain("005", "高橋", 46, "KE"));
syainList.Add(new Syain("001", "鈴木", 32, "SO"));
syainList.Add(new Syain("003", "伊藤", 25, "KA"));
syainList.Add(new Syain("006", "佐藤", 30, "KA"));
syainList.Add(new Syain("007", "田中", 42, "KA"));

var deptList = new List<Dept>();
deptList.Add(new Dept("EI", "営業部"));
deptList.Add(new Dept("KE", "経理部"));
deptList.Add(new Dept("SO", "総務部"));
//deptList.Add(new Dept("KA", "開発部"));

※「開発部」は以下サンプルを分かりやすくするためあえて作成していません。

内部結合(inner join)

例)Syain.deptとDept.deptCdを内部結合する
var result =
    (from x in syainList
     join y in deptList on x.dept equals y.deptCd
     select new { x.id, y.deptNm }).ToArray();
【結果】
[002 営業部] [004 営業部] [005 経理部] [001 総務部]

※内部結合ではDeptに開発部が無いので抽出されません。

外部結合(left outer join)

例)Syain.deptとDept.deptCdを外部結合する
var result =
    (from x in syainList
     join y in deptList on x.dept equals y.deptCd into z
     from y in z.DefaultIfEmpty()
     select new { id = x.id, deptNm = (y != null)?y.deptNm:"" }).ToArray();
【結果】
[002 営業部] [004 営業部] [005 経理部] [001 総務部] [003 ] [006 ] [007 ]

※外部結合ではDeptに開発部が無くても抽出されます。

ToTop