基本的なLINQ

# はじめに
LINQに限った事ではないのですが、使わないと直ぐに忘れるので、基本的なLINQを纏めておこうと思います。

LINQの書き方は「クエリ構文」と「メソッド構文」の2種類がありますが、~~とりあえずは(私の中では)使うことが多い「メソッド構文」に限定します。~~

クエリ構文については別で書きました。

https://qiita.com/masayasu_t/items/c053b5c67be0dcb3c76c

```c#:メソッド構文
var vegetableRethod = m_vegetable.Where(x => x.kind == 2)
                                 .OrderBy(x => x.id)
                                 .Select(x => x.name);
```

```c#:クエリ構文
var vegetableQuery = from x in m_vegetable
                    where x.kind == 2
                  orderby x.id
                   select x.name;
```

# 基本的なLINQ

```c#: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 });

```

### サンプルデータ

<table>
  <caption>m_kind</caption>
  <tr><th>id</th><th>name</th></tr>
  <tr><td>1</td><td>根菜類</td></tr>
  <tr><td>2</td><td>葉茎菜類</td></tr>
  <tr><td>3</td><td>果菜類</td></tr>
  <tr><td>4</td><td>香辛野菜</td></tr>
  <tr><td>5</td><td>果実的野菜</td></tr>
</table>
<br/>
<table>
  <caption>m_vegetable</caption>
  <tr><th>id</th><th>name</th><th>kind</th></tr>
  <tr><td>101</td><td>大根</td><td>1</td></tr>
  <tr><td>102</td><td>人参</td><td>1</td></tr>
  <tr><td>103</td><td>ジャガイモ</td><td>1</td></tr>
  <tr><td>104</td><td>ごぼう</td><td>1</td></tr>
  <tr><td>201</td><td>白菜</td><td>2</td></tr>
  <tr><td>202</td><td>キャベツ</td><td>2</td></tr>
  <tr><td>203</td><td>ほうれん草</td><td>2</td></tr>
  <tr><td>301</td><td>キュウリ</td><td>3</td></tr>
  <tr><td>302</td><td>トマト</td><td>3</td></tr>
  <tr><td>303</td><td>ピーマン</td><td>3</td></tr>
  <tr><td>304</td><td>カボチャ</td><td>3</td></tr>
  <tr><td>305</td><td>枝豆</td><td>3</td></tr>
  <tr><td>501</td><td>メロン</td><td>5</td></tr>
  <tr><td>502</td><td>スイカ</td><td>5</td></tr>
</table>