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; }  // 部署
}

(List生成)
var syainList = new List<Syain>();
syainList.Add(new Syain("002", "山田", 35, "営業部"));
syainList.Add(new Syain("004", "鈴木", 28, "営業部"));
syainList.Add(new Syain("005", "高橋", 46, "経理部"));
syainList.Add(new Syain("001", "鈴木", 32, "総務部"));
syainList.Add(new Syain("003", "伊藤", 25, "開発部"));
syainList.Add(new Syain("006", "佐藤", 30, "開発部"));
syainList.Add(new Syain("007", "田中", 42, "開発部"));

検索(where 等価)

例)部署が「営業部」のデータを抽出する
var result = 
    (from x in syainList
     where x.dept == "営業部"
     select x).ToArray();
【結果】
[002 山田 35 営業部] [004 鈴木 28 営業部]

検索(where 大小)

例)年齢が30歳未満のデータを抽出する
var result = 
    (from x in syainList
     where x.age < 30
     select x).ToArray();
【結果】
[004 鈴木 28 営業部] [003 伊藤 25 開発部]

検索(where 複数)

例)年齢が30歳以上40歳未満のデータを抽出する
var result = 
    (from x in syainList
     where x.age >= 30 && x.age < 40
     select x).ToArray();
【結果】
[002 山田 35 営業部] [001 鈴木 32 総務部] [006 佐藤 30 開発部]

件数(count)

例)部署が「開発部」の人数を取得する
var result = 
    (from x in syainList
     where x.dept == "開発部"
     select x).Count();
【結果】
3

部分一致検索(like)

例)名前が「鈴木」で始まるデータを抽出する
var result = 
    (from x in syainList
     where x.name.StartsWith("鈴木")
     select x).ToArray();
【結果】
[004 鈴木 28 営業部] [001 鈴木 32 総務部]

前方一致の場合は、StartsWithを使用します。
部分一致の場合は、Containsを使用します。
後方一致の場合は、EndsWithを使用します。

IN検索(in)

例)社員IDが"002","005"のデータを抽出する
//IN条件を配列で生成する
string[] arr = new string[]{"002", "005"};

var result =
    (from x in syainList
     where arr.Contains(x.id)
     select x);
【結果】
[002 山田 35 営業部] [005 高橋 46 経理部]

グルーピング(group by)

例)部署の一覧を抽出する
var result =
    (from x in syainList
     group x by new { x.dept } into y
     select new { y.Key.dept }).ToArray();
【結果】
営業部 経理部 総務部 開発部

グルーピング+件数(group by + count)

例)部署毎の人数を求める
var result =
    (from x in syainList
     group x by new { x.dept } into y
     select new { y.Key.dept, cnt = y.Select(a => a.dept).Count() }).ToArray();
【結果】
営業部 - 2 経理部 - 1 総務部 - 1 開発部 - 3

合計(sum)

例)営業部に所属している人の年齢の合計を求める
var result =
    (from x in syainList
     where x.dept == "営業部"
     select x).Sum(a => a.age);
【結果】
63

ソート・昇順(order by asc)

例)年齢順にソート(昇順)する
var result =
    (from x in syainList
     orderby x.age
     select x).ToArray();
【結果】
[003 伊藤 25 開発部] [004 鈴木 28 営業部] [006 佐藤 30 開発部] [001 鈴木 32 総務部] [002 山田 35 営業部] [007 田中 42 開発部] [005 高橋 46 経理部]

クエリ式でソートを行いたい場合は、orderbyを使用します。

ソート・降順(order by desc)

例)年齢順にソート(降順)する
var result =
    (from x in syainList
     orderby x.age descending
     select x).ToArray();
【結果】
[005 高橋 46 経理部] [007 田中 42 開発部] [002 山田 35 営業部] [001 鈴木 32 総務部] [006 佐藤 30 開発部] [004 鈴木 28 営業部] [003 伊藤 25 開発部]

降順の場合、descendingを指定します。

ソート・複数(order by 複数)

例)部署(昇順)、年齢(昇順)でソートを行う
var result =
    (from x in syainList
     orderby x.dept, x.age
     select x).ToArray();
【結果】
[004 鈴木 28 営業部] [002 山田 35 営業部] [003 伊藤 25 開発部] [006 佐藤 30 開発部] [007 田中 42 開発部] [005 高橋 46 経理部] [001 鈴木 32 総務部]

ソートを複数指定する場合は、カンマで区切って続けます。

ソート・複数[昇順/降順](order by 複数(asc + desc))

例)部署(昇順)、年齢(降順)でソートを行う
var result =
    (from x in syainList
     orderby x.dept, x.age descending
     select x).ToArray();
【結果】
[002 山田 35 営業部] [004 鈴木 28 営業部] [007 田中 42 開発部] [006 佐藤 30 開発部] [003 伊藤 25 開発部] [005 高橋 46 経理部] [001 鈴木 32 総務部]

最初の1件のみ抽出

例)年齢順にソートした最初の1件のみ取得する
var result =
    (from x in syainList
     orderby x.age
     select x).FirstOrDefault();
【結果】
[003 伊藤 25 開発部]

※データが無い場合はnullが返ります。

ToTop