Edited at

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

More than 3 years have passed since last update.


環境


  • 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



参考資料