LoginSignup
15
17

More than 5 years have passed since last update.

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

Last updated at Posted at 2014-09-19

環境

  • 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

参考資料

15
17
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
15
17