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 = syainList
  .Join(deptList, x => x.dept, y => y.deptCd, (x,y) => new{x.id, y.deptNm})
  .ToArray();
【結果】
[002 営業部] [004 営業部] [005 経理部] [001 総務部]

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

外部結合(left outer join)

例)Syain.deptとDept.deptCdを外部結合する
var result = syainList
  .GroupJoin(deptList, x => x.dept, y => y.deptCd, (a, b) => new { a,b })
  .SelectMany(x => x.b.DefaultIfEmpty(),(x, y) => new
    {
      id = x.a.id,
      deptNm = (y != null) ? y.deptNm : ""
    });
【結果】
[002 営業部] [004 営業部] [005 経理部] [001 総務部] [003 ] [006 ] [007 ]

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

ToTop