LINQの便利さに感動したのでその時のメモ

#### 環境 ####
* Visual Basic 2008 Express
* .net framework 3.5
* MS-SQL 2008 R2

大人の都合で古めの環境w

### メリット ###
* SQLをコード内に含まないので不要なバグが混入しにくい
* よって、コードの統一性が保たれる
* DBNullとおさらばできる？？
* マッピング情報をプロジェクト内に定義するため、VSのコード補完機能の恩恵がある。
* なにより、コードを簡潔に書けるので使っていて楽しい <-- ここ重要

### デメリット ###
* Expressであると構成を自力で作成する手間がある
* なれていないと、初期の学習コストがかかる（かかっている）

### 前準備 ###
* Visual Studioでプロジェクトを作成する
* 作成したプロジェクトに"LINQ to SQL"を新規作成で追加
* ↑で作成した*.dbmlに自力でスキーマやスキーマの関連性を作成 ※Express以外であれば、データベースエクスプローラでDrag&Dropで作成できる、らしい。

## サンプルコード ##
### LINQ to SQL (クエリ構文)　###

基本的な形
※以下をベースに進める

```vbnet:sample.vb
Dim query = From row In hogeTable
            Where _
            row.column1.StartsWith(_property.value1)) And _
            row.column2.StartsWith(_property.value2)) _
            Select row
```


n行目からx行を取得する場合。
ちなみに下のように指定すると実際のSQLにはROW_NUMBER()が追加されている。Skilp(0)だと無理だった。

```vbnet:sample.vb
Dim query = From row In hogeTable
            Where _
            row.column1.StartsWith(_property.value1)) And _
            row.column2.StartsWith(_property.value2)) _
            Skip (1) Take (2) 

            Select row
```


業務アプリとかだとありそうな期間指定による検索の場合。
注意点は比較対象のオブジェクトをお互いに合わせておくこと。 今回であればDate型で統一している。

```vbnet:sample.vb
Dim query = From row In hogeTable
            Where _
            row.column1.StartsWith(_property.value1)) And _
            row.column2.StartsWith(_property.value2)) _
            row.Column3.Date >= _property.value3.Date) And _
            row.Column4.Date <= _property.value4.Date) _
            Select row
```


動的な検索条件を指定する場合。
複数の条件を指定する時に、value1が無い時はそれを含めない。けどvalue1が有る時はそれを含めたいという場合のサンプル。

```vbnet:sample.vb
Dim query = From row In hogeTable
            Where _
            (String.IsNullOrEmpty(_property.value1) Or row.column1.StartsWith(_property.value1)) And _
            (String.IsNullOrEmpty(_property.value2) Or row.column2.StartsWith(_property.value2)) And _
            ((_property.value3 = Nothing) Or row.column3.Date >= _property.value3.Date)_
            Select row
```

結合する場合。
特に考える事なく可能。

```vbnet:sample.vb
Dim query = From row1 In hogeTable1
            Join row2 In hogeTable2 On row2.column1 Equals row1.column1
            Where _
            (String.IsNullOrEmpty(_property.value1) Or row.column1.StartsWith(_property.value1)) And _
            (String.IsNullOrEmpty(_property.value2) Or row.column2.StartsWith(_property.value2)) And _
            ((_property.value3 = Nothing) Or row.column3.Date >= _property.value3.Date)_
            Select row
```

### LINQ to Object ###
ある値からある値の範囲で奇数もしくは偶数の数値リストを作成
適用しそうな状況としては、DataGridViewの背景色を行単位で交互に変更する時など。
DataGridViewのプロパティで対応できる事が解ったので、今の所用途が不明。。。

``` vbnet:sample.vb
## 偶数
Dim list = Enumerable.Range( _
        0, _
        10).Where( _
        Function(n) n Mod 2 = 0 _
    ).ToList

## 奇数
Dim list = Enumerable.Range( _
        0, _
        10).Where( _
        Function(n) n Mod 2 = 1 _
    ).ToList
```


## 参考資料 ##
* [VBプログラマーのためのLINQ超入門（前編）](http://www.atmarkit.co.jp/fdotnet/special/vblinq01/vblinq01_01.html)
* [VBプログラマーのためのLINQ超入門（後編）](http://www.atmarkit.co.jp/fdotnet/special/vblinq02/vblinq02_01.html)
* [LINQ文で動的にWhere句を組み立てるには？［3.5、C#、VB］](http://www.atmarkit.co.jp/fdotnet/dotnettips/986dynamiclinq/dynamiclinq.html)
* [Distinct in LINQ with anonymous types (in VB.NET)](http://stackoverflow.com/questions/6556077/distinct-in-linq-with-anonymous-types-in-vb-net)
* [LINQで動的検索条件](http://tech.ewdev.info/2012/03/377/)
* [VBラムダ式 基礎文法最速マスター](http://www.atmarkit.co.jp/fdotnet/rapidmaster/rapidmaster_02/rapidmaster_02.html)