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が返ります。