はじめに
LINQに限った事ではないのですが、使わないと直ぐに忘れるので、基本的なLINQを纏めておこうと思います。
LINQの書き方は「クエリ構文」と「メソッド構文」の2種類がありますが、とりあえずは(私の中では)使うことが多い「メソッド構文」に限定します。
クエリ構文については別で書きました。
メソッド構文
var vegetableRethod = m_vegetable.Where(x => x.kind == 2)
.OrderBy(x => x.id)
.Select(x => x.name);
クエリ構文
var vegetableQuery = from x in m_vegetable
where x.kind == 2
orderby x.id
select x.name;
基本的なLINQ
LINQ
// 下記のデータを設定
IEnumerable<m_kind> m_kind = getKind();
IEnumerable<m_vegetable> m_vegetable = getVegetable();
// x.kind == 3が存在するか
bool vegetableAny = m_vegetable.Any(x => x.kind == 3);
// x.kind == 2が何個あるか
int vegetableCount = m_vegetable.Count(x => x.kind == 2);
// x.idの昇順に並び替え
var vegetableOrderBy = m_vegetable.OrderBy(x => x.id);
// x.idの降順に並び替え
var vegetableOrderByDescending = m_vegetable.OrderByDescending(x => x.id);
// x.kind == 1のデータを絞り込み
var vegetableWhere = m_vegetable.Where(x => x.kind == 1);
// isRoot(x.kind == 1の場合:true、それ以外の場合:false)を追加
var vegetableSelect = m_vegetable.Select
(x => new { x.id
, x.name
, x.kind
, isRoot = x.kind == 1 });
// i(連番)を追加、x.kindを除外
var vegetableSelectAddIndex = m_vegetable.Select((x, i) => new { i, x.id, x.name });
// 内部結合
var vegetableJoin= m_vegetable.Join
(m_kind
, x => x.kind
, y => y.id
, (x, y) => new { x.id
, x.name
, kind_id = x.kind
, kind_name = y.name });
// 内部結合(上と結合する順序が違うだけで、結果は同じ)
var vegetableInnerJoin = m_kind.Join
(m_vegetable
, x => x.id
, y => y.kind
, (x, y) => new { y.id
, y.name
, kind_id = y.kind
, kind_name = x.name });
// 外部結合
var vegetableOuterJoin = m_kind.GroupJoin
(m_vegetable
, x => x.id
, y => y.kind
, (x, y) => new { x, y })
.SelectMany
(z => z.y.DefaultIfEmpty
(new m_vegetable { id = 0
, name = ""
, kind = 0 })
, (z, w) => new { w.id
, w.name
, kind_id = z.x.id
, kind_name = z.x.name });
追記
結合条件が複数の場合
m_kind.Join
(m_vegetable
, x => new {col1 = x.id, col2 = x.type}
, y => new {col1 = y.kind, col2 = y.type}
, (x, y) => ~
上記のように書くと
x.id = y.kind AND x.type = y.type
になる。
サンプルデータ
表示/非表示
| id | name |
|---|---|
| 1 | 根菜類 |
| 2 | 葉茎菜類 |
| 3 | 果菜類 |
| 4 | 香辛野菜 |
| 5 | 果実的野菜 |
| id | name | kind |
|---|---|---|
| 101 | 大根 | 1 |
| 102 | 人参 | 1 |
| 103 | ジャガイモ | 1 |
| 104 | ごぼう | 1 |
| 201 | 白菜 | 2 |
| 202 | キャベツ | 2 |
| 203 | ほうれん草 | 2 |
| 301 | キュウリ | 3 |
| 302 | トマト | 3 |
| 303 | ピーマン | 3 |
| 304 | カボチャ | 3 |
| 305 | 枝豆 | 3 |
| 501 | メロン | 5 |
| 502 | スイカ | 5 |