環境
- 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