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 (クエリ構文) 

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

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)だと無理だった。

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型で統一している。

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が有る時はそれを含めたいという場合のサンプル。

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

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

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のプロパティで対応できる事が解ったので、今の所用途が不明。。。

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

参考資料