はじめに
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 });
サンプルデータ
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 |