sql server 2008 自習書シリーズ nodownload.microsoft.com/.../sql08_selflearning20_linq.pdf ·...

101
SQL Server 2008 自習書シリーズ No.20 LINQ によるデータ ゕクセス入門 Published: 2008 6 30 改訂版: 2008 11 10 有限会社エスキューエル・クオリテゖ

Upload: hoanghanh

Post on 14-Mar-2018

239 views

Category:

Documents


6 download

TRANSCRIPT

Page 1: SQL Server 2008 自習書シリーズ Nodownload.microsoft.com/.../SQL08_SelfLearning20_LINQ.pdf · sql server 2008 自習書 no.20 linq によるデータ ゕクセス入門 4 stteepp

SQL Server 2008 自習書シリーズ No.20

LINQ によるデータ ゕクセス入門

Published: 2008 年 6 月 30 日

改訂版: 2008 年 11 月 10 日

有限会社エスキューエル・クオリテゖ

Page 2: SQL Server 2008 自習書シリーズ Nodownload.microsoft.com/.../SQL08_SelfLearning20_LINQ.pdf · sql server 2008 自習書 no.20 linq によるデータ ゕクセス入門 4 stteepp

SQL Server 2008 自習書 No.20 LINQ によるデータ ゕクセス入門

2

この文章に含まれる情報は、公表の日付の時点での Microsoft Corporation の考え方を表しています。市場の変化に応える必要があるた

め、Microsoft は記載されている内容を約束しているわけではありません。この文書の内容は印刷後も正しいとは保障できません。この文章

は情報の提供のみを目的としています。

Microsoft、SQL Server、Visual Studio、Windows、Windows XP、Windows Server、Windows Vistaは Microsoft Corporation の米国

およびその他の国における登録商標です。

その他、記載されている会社名および製品名は、各社の商標または登録商標です。

© Copyright 2008 Microsoft Corporation. All rights reserved.

Page 3: SQL Server 2008 自習書シリーズ Nodownload.microsoft.com/.../SQL08_SelfLearning20_LINQ.pdf · sql server 2008 自習書 no.20 linq によるデータ ゕクセス入門 4 stteepp

SQL Server 2008 自習書 No.20 LINQ によるデータ ゕクセス入門

3

目次

SSTTEEPP 11.. LLIINNQQ のの概概要要 とと自自習習書書をを試試すす環環境境ににつついいてて .............................................................. 4

1.1 LINQ の概要 ....................................................................................................... 5

1.2 自習書を試す環境について ...................................................................................... 8

1.3 Visual Studio 2008 SP1(Beta 版)のダウンロード ....................................................10

1.4 サンプル データベース「Northwind」のダウンロード ..................................................11

SSTTEEPP 22.. LLIINNQQ ttoo SSQQLL のの基基本本 .........................................................................................16

2.1 作成するゕプリケーション .....................................................................................17

2.2 Visual Studio 2008 の起動とプロジェクトの新規作成 ..................................................18

2.3 LINQ to SQL クラスの追加(.dbml フゔル) .........................................................20

2.4 LINQ による単純な SELECT ステートメントの実行 ....................................................25

SSTTEEPP 33.. LLIINNQQ ttoo SSQQLL ププロロババダダでで 自自動動生生成成さされれるる SSQQLL のの確確認認 ...........................................30

3.1 作成するゕプリケーション .....................................................................................31

3.2 LINQ to SQL プロバダで自動生成される SQL の確認 ...............................................32

SSTTEEPP 44.. デデーータタのの並並べべ替替ええ ((OOrrddeerr BByy 句句)) ......................................................................35

4.1 作成するゕプリケーション .....................................................................................36

4.2 プロジェクトの新規作成と LINQ to SQL クラスの作成 ................................................37

SSTTEEPP 55.. 条条件件指指定定にによよるる行行のの絞絞りり込込みみ ((WWhheerree 句句)) ...........................................................45

5.1 作成するゕプリケーション .....................................................................................46

5.2 LINQ による行の絞り込み: Where 句 ....................................................................47

SSTTEEPP 66.. 前前方方一一致致とと部部分分一一致致にによよるる検検索索 ............................................................................52

6.1 作成するゕプリケーション .....................................................................................53

6.2 LINQ での文字列検索(StatsWith、Contains) .........................................................54

SSTTEEPP 77.. テテーーブブルルのの結結合合((JJOOIINN)) ....................................................................................63

7.1 作成するゕプリケーション .....................................................................................64

7.2 プロジェクトの作成とコントロールの配置 .................................................................65

SSTTEEPP 88.. AASSPP..NNEETT WWeebb フフォォーームムかかららのの LLIINNQQ のの利利用用 ..........................................................72

8.1 作成するゕプリケーション .....................................................................................73

8.2 プロジェクトの作成と LINQ to SQL クラスの作成 ......................................................74

SSTTEEPP 99.. LLIINNQQ ttoo SSQQLL にによよるるデデーータタ更更新新 ...........................................................................85

9.1 作成するゕプリケーション .....................................................................................86

9.2 LINQ to SQL によるデータ更新 ..............................................................................87

Page 4: SQL Server 2008 自習書シリーズ Nodownload.microsoft.com/.../SQL08_SelfLearning20_LINQ.pdf · sql server 2008 自習書 no.20 linq によるデータ ゕクセス入門 4 stteepp

SQL Server 2008 自習書 No.20 LINQ によるデータ ゕクセス入門

4

SSTTEEPP 11.. LLIINNQQ のの概概要要

とと自自習習書書をを試試すす環環境境ににつついいてて

この STEP では、LINQ の概要と自習書を試す環境について説明します。

この STEP では、次のことを学習します。

LINQ の概要

自習書を試す環境について

サンプル スクリプトについて

Page 5: SQL Server 2008 自習書シリーズ Nodownload.microsoft.com/.../SQL08_SelfLearning20_LINQ.pdf · sql server 2008 自習書 no.20 linq によるデータ ゕクセス入門 4 stteepp

SQL Server 2008 自習書 No.20 LINQ によるデータ ゕクセス入門

5

1.1 LINQ の概要

LINQ の概要

LINQ(リンク)は、Language Integrated Query(統合言語クエリ)の略で、Visual Basic 9.0

(以下、VB 9.0)や C# 3.0 へ組み込まれた新しい ”データ クエリ技術” です。これを利用する

と、プログラミング言語内へ SQL ステートメントと非常に似た構文で、データに対するクエリ(検

索)を記述できるようになります。次のコードは、VB 9.0 から LINQ を利用している例です。

' SQL Server 上の Northwind データベース内の Categories テーブルを検索している例

Dim Categories = From c In Northwind.Categories _

Where c.CategoryName.StartsWith(TextBox1.Text) _

Order By c.CategoryID Descending _

Select c.CategoryID, c.CategoryName

このように LINQ では、From や Where、Order By、Select など、SQL ステートメントで

お馴染みのキーワードを、プログラミング言語内へ記述できるようになります。

LINQ では、LINQ プロバダを介すことによって、さまざまなデータソースに対してクエリを実

行することができます。

SQL Server のデータをクエリするための LINQ プロバダは、「LINQ to SQL」です。そのほ

かのプロバダには、任意のコレクションや配列データ(正確には、IEnumerable なオブジェク

ト)をクエリできる「LINQ to Objects」、XML データをクエリできる「LINQ to XML」、ADO.NET

の DataSet オブジェクトをクエリできる「LINQ to DataSet」などがあります。

どのデータソースに対しても、SQL ステートメントに似た、前述のクエリ式(From 句や Where

句、Select 句など)を利用して、クエリ(データ検索)を実行できる点が LINQ の大きなメリッ

トです。

LINQ プロバイダ

LINQ to Objects LINQ to XMLLINQ to SQL LINQ to DataSet LINQ to Entities

データ ソース

SQL ServerXMLオブジェクト

プログラミング言語

Visual Basic 9.0 C# 3.0

DataSetADO.NET

Entity Model

Page 6: SQL Server 2008 自習書シリーズ Nodownload.microsoft.com/.../SQL08_SelfLearning20_LINQ.pdf · sql server 2008 自習書 no.20 linq によるデータ ゕクセス入門 4 stteepp

SQL Server 2008 自習書 No.20 LINQ によるデータ ゕクセス入門

6

この自習書で使用する LINQ プロバイダ: LINQ to SQL

この自習書では、プログラミング言語に Visual Basic 9.0、LINQ プロバダに LINQ to SQL、

データ ソースに SQL Server 2008 を使用します。LINQ to SQL プロバダは、SQL Server の

ためのプロバダで、以前のバージョンの SQL Server 2005 や SQL Server 2000 を対象とす

ることも可能です(SQL Server 2000 を利用する場合は、一部の機能で制限を受けます)。

LINQ to SQL の役割は、Visual Basic や C# のソース コード内へ記述された LINQ クエリを、

SQL Server に対する SQL ステートメント(Transact-SQL)へ変換して発行することです。

また、LINQ to SQL プロバダは、SQL Server から受け取った結果セットをオブジェクト コレ

クションへ変換する役割も担います。これによって、ソースコード内へ SQL ステートメントを記

述することなく、SQL Server のデータを取得できるようになります。

DataContext オブジェクト(LINQ to SQL へのアクセスを抽象化)

LINQ to SQL へのゕクセスは、DataContext と呼ばれる、データ ゕクセスを抽象化するラッパ

ー クラスを通して行います。このクラスは、Visual Studio 2008 で提供される「O/R デザイナ」

と呼ばれる GUI ツールによって、自動生成することができます。

データ ソース

SQL Server

LINQ to SQL

DataContextオブジェクト

言語

VB 9.0

SQL ステートメントへ変換

オブジェクトコレクションオブジェクト

コレクションオブジェクトコレクション

結果セットをオブジェクトコレクションへ変換

LINQ クエリ

From c In Northwind.Categories _Where c.CategoryID = 3 _Select c

SQL ステートメント

SELECT * FROM CategoriesWHERE CategoryID = 3

Norhtwind DB

Categories テーブル

O/R デザイナ

Page 7: SQL Server 2008 自習書シリーズ Nodownload.microsoft.com/.../SQL08_SelfLearning20_LINQ.pdf · sql server 2008 自習書 no.20 linq によるデータ ゕクセス入門 4 stteepp

SQL Server 2008 自習書 No.20 LINQ によるデータ ゕクセス入門

7

O/R デザナでは、SQL Server 上のデータベース テーブルと、オブジェクトの O/R マッピン

グを GUI 操作でデザンすることができます。このデザナで作成したデータ モデルは、.dbml

(Database Mapping Language)と呼ばれるフゔルへ格納され、LINQ to SQL プロバダへ

のゕクセスを抽象化する DataContext クラスのクラス定義を自動生成してくれます。プログラム

からの LINQ 呼び出しは、この DataContext を通して行うことができます。

LINQ の特徴をまとめると次のようになります。

SQL ステートメントと非常に似ている構文(LINQ クエリ)で、SQL Server のデータ

を取得できる(SQL ステートメントをソースコード内へ記述する必要がない)

同じ構文で、異なるデータをクエリ可能(LINQ クエリは、SQL Server だけでなく、コ

レクションや配列、XML データ、DataSet オブジェクトなども同じ構文でクエリできる)

インテリセンスによる入力補完が効くので、クエリの記述が簡単

この自習書では、単純な SELECT ステートメントの実行から、簡単に試せるように構成してある

ので、ぜひチャレンジしてみてください。

ンテリセンスで列名の一覧が表示される

Page 8: SQL Server 2008 自習書シリーズ Nodownload.microsoft.com/.../SQL08_SelfLearning20_LINQ.pdf · sql server 2008 自習書 no.20 linq によるデータ ゕクセス入門 4 stteepp

SQL Server 2008 自習書 No.20 LINQ によるデータ ゕクセス入門

8

1.2 自習書を試す環境について

必要な環境

この自習書で実習を行うために必要な環境は次のとおりです。

OS

Windows Server 2003 SP2(Service Pack 2)以降 または

Windows XP Professional SP2 以降 または

Windows Vista または

Windows Server 2008

ソフトウェア

Visual Studio 2008 Service Pack 1

SQL Server 2008 Enterprise / Developer / Standard / Workgroup Edition

この自習書内での画面やテキストは、OS に Windows Server 2003 SP2、ソフトウェゕに

SQL Server 2008 Enterprise Edition を利用して記述しています。

LINQ to SQL を SQL Server 2008 に対して、実行するには、Visual Studio 2008 の SP1 が

必須のコンポーネントになります。

そのほか

この自習書を試すには、次の項で説明する Visual Studio 2008 SP1 とサンプル データベース

をダウンロードして、セットゕップしておく必要があります。

Page 9: SQL Server 2008 自習書シリーズ Nodownload.microsoft.com/.../SQL08_SelfLearning20_LINQ.pdf · sql server 2008 自習書 no.20 linq によるデータ ゕクセス入門 4 stteepp

SQL Server 2008 自習書 No.20 LINQ によるデータ ゕクセス入門

9

Note: Visual Studio 2008 と共存させる場合の注意点

Visual Studio 2008 と SQL Server 2008 を同じマシンにンストールする場合には、次の 2 点に注意する必要があ

ります。

■ Visual Studio 2008 をインストール済みのマシンへ SQL Server 2008 をインストールする場合

Visual Studio 2008 をンストール済みのマシンへ SQL Server 2008 をンストールする場合には、SQL Server

2008 をンストールする前に、Visual Studio 2008 の Service Pack 1(SP1)を適用しておく必要があります。もし、

Visual Studio 2008 SP1 を適用していない場合には、SQL Server 2008 ンストール時に、次のように[ンストー

ル ルール]画面で「失敗」となり、ンストールを続行することができなくなります。

■ SQL Server 2008 のインストール後に、Visual Studio 2008 をインストールする場合

筆者の環境では、SQL Server 2008 をンストール済みのマシンへ、後から Visual Studio 2008 をンストールした

場合に、「ンストールは成功」と表示されるにも関わらず、Visual Studio 2008 の選択した機能(VB や C#)がン

ストールされていないことが何度かありました。この場合は、Visual Studio 2008 の修復セットゕップを実行すること

で、正常にンストールすることができました。

Visual Studio 2008 SP1 をンストールしていない場合はンストールが失敗する

Page 10: SQL Server 2008 自習書シリーズ Nodownload.microsoft.com/.../SQL08_SelfLearning20_LINQ.pdf · sql server 2008 自習書 no.20 linq によるデータ ゕクセス入門 4 stteepp

SQL Server 2008 自習書 No.20 LINQ によるデータ ゕクセス入門

10

1.3 Visual Studio 2008 SP1 のダウンロード

Visual Studio 2008 SP1 のダウンロード(必須作業)

Visual Studio 2008 SP1 は、次の URL から行えます。

Visual Studio 2008 Service Pack 1

http://www.microsoft.com/downloads/details.aspx?FamilyID=fbee1648-7106-44a7-964

9-6d9f6d58056e&displaylang=ja

LINQ to SQL を利用して SQL Server 2008 へゕクセスするには必須のコンポーネントになるの

で、必ずダウンロードして、ンストールしておいてください。

Page 11: SQL Server 2008 自習書シリーズ Nodownload.microsoft.com/.../SQL08_SelfLearning20_LINQ.pdf · sql server 2008 自習書 no.20 linq によるデータ ゕクセス入門 4 stteepp

SQL Server 2008 自習書 No.20 LINQ によるデータ ゕクセス入門

11

1.4 サンプル データベース「Northwind」のダウンロード

サンプル データベースのダウンロード(必須作業)

この自習書では、すべての手順で「Northwind」サンプル データベースを利用するので、STEP2

以降を始める前に、必ずこのデータベースをダウンロードして、SQL Server 2008 へゕタッチし

ておく必要があります。ダウンロードとゕタッチの手順は、次のとおりです。

Northwind サンプル データベースのダウンロード

Northwind サンプル データベースは、SQL Server 2000 向けに提供されていたサンプル デー

タベースを SQL Server 2005 で利用できるようにしたものです。SQL Server 2008 でも問題な

く利用できるので、この自習書では、このデータベースを利用します。ダウンロードは、以下の URL

から行えます。

Northwind and pubs Sample Databases for SQL Server 2000

http://www.microsoft.com/downloads/details.aspx?FamilyId=06616212-0356-46A0-8D

A2-EEBC53A68034

Northwind データベースのセットアップ

1. Northwind デ ー タ ベ ー ス を セ ッ ト ゕ ッ プ す る に は 、 ダ ウ ン ロ ー ド し た

「SQL2005sampleDb.msi」フゔルをダブル クリックします。

2. これにより、次の Setup Wizard が起動します。

Page 12: SQL Server 2008 自習書シリーズ Nodownload.microsoft.com/.../SQL08_SelfLearning20_LINQ.pdf · sql server 2008 自習書 no.20 linq によるデータ ゕクセス入門 4 stteepp

SQL Server 2008 自習書 No.20 LINQ によるデータ ゕクセス入門

12

[Next]ボタンをクリックして、次へ進みます。

3. 次のラセンス画面では、「I Agree」をチェックして、[Next]ボタンをクリックします。

4. 残りの画面は、すべてデフォルトのまま次へ進みます。

5. セットゕップが完了すると、[スタート]メニューの[すべてのプログラム]へ[Microsoft SQL

1

1

2

1

1

1

Page 13: SQL Server 2008 自習書シリーズ Nodownload.microsoft.com/.../SQL08_SelfLearning20_LINQ.pdf · sql server 2008 自習書 no.20 linq によるデータ ゕクセス入門 4 stteepp

SQL Server 2008 自習書 No.20 LINQ によるデータ ゕクセス入門

13

Server 2000 Sample Database Scripts]が追加されるので、これをクリックします。

6. これにより、サンプル データベースがンストールされたフォルダが開かれます。

「C:\SQL Server 2000 Sample Databases」フォルダが開き、この中の「NORTHWND.

MDF」と「NORTHWND.LDF」が、Northwind データベースの実体となるフゔルです。

7. 次に、このフゔルを SQL Server 2008 へ認識(ゕタッチ)させるために、Management

Studio を起動します。Management Studio を起動するには、[スタート]メニューの[す

べてのプログラム]から、[Microsoft SQL Server 2008]→[SQL Server Management

Studio]をクリックします。

8. これにより、[サーバーへの接続]ダゕログが表示されるので、[サーバー名]へ SQL Server

Page 14: SQL Server 2008 自習書シリーズ Nodownload.microsoft.com/.../SQL08_SelfLearning20_LINQ.pdf · sql server 2008 自習書 no.20 linq によるデータ ゕクセス入門 4 stteepp

SQL Server 2008 自習書 No.20 LINQ によるデータ ゕクセス入門

14

の名前を入力し、[接続]ボタンをクリックします。

9. 接続完了後、次のように[データベース]フォルダを右クリックして[アタッチ]をクリック

します。

10. すると、次のように[データベースのゕタッチ]ダゕログが表示されるので、[追加]ボタ

ンをクリックします。

「C:\SQL Server 2000 Sample Databases」フォルダを展開して、「NORTHWND.MDF」

フゔルを選択し、[OK]ボタンをクリックします。

SQL Server の名前を入力します1

[接続] ボタンをクリックします2

[データベース] を右クリックします1

[ゕタッチ] をクリックします2

[追加] ボタンをクリックします1

サンプル データベースがンストールされたフォルダを展開して、

NORTHWND.MDF を選択します

2

[OK] ボタンをクリックします3

Page 15: SQL Server 2008 自習書シリーズ Nodownload.microsoft.com/.../SQL08_SelfLearning20_LINQ.pdf · sql server 2008 自習書 no.20 linq によるデータ ゕクセス入門 4 stteepp

SQL Server 2008 自習書 No.20 LINQ によるデータ ゕクセス入門

15

11. [データベースのゕタッチ]ダゕログへ戻ったら、[OK]ボタンをクリックします。

以上でゕタッチが完了です。もし、エラーが出る場合は、SQL Server のサービス ゕカウン

トに対して、「NORTHWND.MDF」フゔルへの NTFS ゕクセス権限が付与されているかど

うかを確認してみてください。

12. ゕタッチが完了すると、次のように[データベース]フォルダへ「Northwind」データベー

スが追加されて、データベースが利用できるようになります。

[OK] ボタンをクリックします1

Page 16: SQL Server 2008 自習書シリーズ Nodownload.microsoft.com/.../SQL08_SelfLearning20_LINQ.pdf · sql server 2008 自習書 no.20 linq によるデータ ゕクセス入門 4 stteepp

SQL Server 2008 自習書 No.20 LINQ によるデータ ゕクセス入門

16

SSTTEEPP 22.. LLIINNQQ ttoo SSQQLL のの基基本本

この STEP では、LINQ to SQL の基本について説明します。

この STEP では、次のことを学習します。

.dbml フゔル(LINQ to SQL クラス)によるデータモデリング

コンソール ゕプリケーションでの LINQ to SQL の利用

単純な SELECT ステートメントの実行

Page 17: SQL Server 2008 自習書シリーズ Nodownload.microsoft.com/.../SQL08_SelfLearning20_LINQ.pdf · sql server 2008 自習書 no.20 linq によるデータ ゕクセス入門 4 stteepp

SQL Server 2008 自習書 No.20 LINQ によるデータ ゕクセス入門

17

2.1 作成するアプリケーション

この STEP で作成するアプリケーション

この STEP では、LINQ to SQL を使用して、Northwind データベースへゕクセスし、次のよ

うに Categories テーブルのデータ(商品カテゴリ一覧)を表示するコンソール ゕプリケーショ

ンを作成する手順を説明します。

Categories テーブルのデータは、SQL Server の Management Studio で、次のように操作し

て、確認することができます。

このテーブルには、Beverages(飲料)カテゴリや、Condiments(香辛料)カテゴリなど、8 つ

の商品カテゴリが格納されています。

Categories テーブルのカテゴリ一覧を取得

Categories テーブルを右クリックして「上位 1000 行の選択」をクリック

1

Categories テーブル内の商品カテゴリの一覧

Page 18: SQL Server 2008 自習書シリーズ Nodownload.microsoft.com/.../SQL08_SelfLearning20_LINQ.pdf · sql server 2008 自習書 no.20 linq によるデータ ゕクセス入門 4 stteepp

SQL Server 2008 自習書 No.20 LINQ によるデータ ゕクセス入門

18

2.2 Visual Studio 2008 の起動とプロジェクトの新規作成

Visual Studio 2008 の起動とプロジェクトの新規作成

まずは、Visual Studio 2008 を起動して、コンソール ゕプリケーション用のプロジェクトを新し

く作成しましょう。

1. Visual Studio 2008 を起動するには、[スタート]メニューの[すべてのプログラム]から、

[Microsoft Visual Stduio 2008]→[Microsoft Visual Studio 2008]をクリックし

ます。

2. 起動後、[ファイル]メニューの[新規作成]から[プロジェクト]をクリックします。

3. [新しいプロジェクト]ダゕログが表示されたら、[プロジェクトの種類]で「Visual Basic」

を選択し、[テンプレート]から「コンソール アプリケーション」を選択します。

1 2

Page 19: SQL Server 2008 自習書シリーズ Nodownload.microsoft.com/.../SQL08_SelfLearning20_LINQ.pdf · sql server 2008 自習書 no.20 linq によるデータ ゕクセス入門 4 stteepp

SQL Server 2008 自習書 No.20 LINQ によるデータ ゕクセス入門

19

[プロジェクト名]へ「ConsoleApplication1」など任意の名前を入力して、[OK]ボタン

をクリックします。

1

2

3

4

Page 20: SQL Server 2008 自習書シリーズ Nodownload.microsoft.com/.../SQL08_SelfLearning20_LINQ.pdf · sql server 2008 自習書 no.20 linq によるデータ ゕクセス入門 4 stteepp

SQL Server 2008 自習書 No.20 LINQ によるデータ ゕクセス入門

20

2.3 LINQ to SQL クラスの追加(.dbml ファイル)

LINQ to SQL クラスの追加

次に、LINQ to SQL プロバダを利用するために、LINQ to SQL クラス(.dbml フゔル)を

プロジェクトへ追加します。LINQ to SQL クラスを追加する手順は、次のとおりです。

1. まずは、[プロジェクト]メニューの[新しい項目の追加]をクリックします。

2. [新しいプロジェクト]ダゕログが表示されたら、[カテゴリ]で[共通項目]を選択し、

[テンプレート]から[LINQ to SQL クラス]を選択します。

[フゔル名]へ「DataClasses1.dbml」など任意の名前を入力して、[追加]ボタンをク

リックします。

3. これにより、ソリューション エクスプローラへ DataClasses1.dbml フゔルが追加され、

画面中央へ「O/R デザイナ」が表示されます。

1

2

1

2

3

4

Page 21: SQL Server 2008 自習書シリーズ Nodownload.microsoft.com/.../SQL08_SelfLearning20_LINQ.pdf · sql server 2008 自習書 no.20 linq によるデータ ゕクセス入門 4 stteepp

SQL Server 2008 自習書 No.20 LINQ によるデータ ゕクセス入門

21

なお、拡張子の .dbml は、「Database Mapping Language」の略です。

.dbml ファイルへ Categories と Products テーブルの追加

次に、.dbml フゔル(LINQ to SQL クラス)へ Northwind データベースの Categories と

Products テーブルを、エンテゖテゖとして追加します。.dbml フゔルへエンテゖテゖ追加す

る手順は、次のとおりです。

1. まず、[表示]メニューの[サーバー エクスプローラ]をクリックして、サーバー エクスプ

ローラを表示します。

2. サーバー エクスプローラが表示されたら、次のように[データ接続]ノードを右クリックし

て、[接続の追加]をクリックします。

DataClasses1.dbmlフゔルが追加される

O/R デザイナ

1

Page 22: SQL Server 2008 自習書シリーズ Nodownload.microsoft.com/.../SQL08_SelfLearning20_LINQ.pdf · sql server 2008 自習書 no.20 linq によるデータ ゕクセス入門 4 stteepp

SQL Server 2008 自習書 No.20 LINQ によるデータ ゕクセス入門

22

[データ ソースの選択]ダゕログでは、[Microsoft SQL Server]を選択して、[続行]

ボタンをクリックします。

これにより、[接続の追加]ダゕログが表示されるので、[サーバー名]へ接続先となる SQL

Server の名前を入力します。

[サーバーにログオンする]では「Windows 認証を使用する」をチェックし、[データベー

ス名の選択または入力]では「Northwind」データベースを選択して、[OK]ボタンをクリ

ックします。

これで、データベースへの接続が追加され、次のように[テーブル]フォルダを展開すると、

Northwind データベース内のテーブルの一覧が表示されるようになります。

1

3

4

1

2

3

4

Page 23: SQL Server 2008 自習書シリーズ Nodownload.microsoft.com/.../SQL08_SelfLearning20_LINQ.pdf · sql server 2008 自習書 no.20 linq によるデータ ゕクセス入門 4 stteepp

SQL Server 2008 自習書 No.20 LINQ によるデータ ゕクセス入門

23

サーバー エクスプローラから O/R デザイナへドラッグ&ドロップ

次に、サーバー エクスプローラで表示されたテーブルの一覧から、O/R デザナへテーブルをド

ラッグ&ドロップして、エンテゖテゖとして追加します。

3. 次のように[テーブル]フォルダの「Categories」テーブルと「Products」テーブルを O/R

デザナへドラッグ&ドロップします。

これにより、O/R デザナ上へ Categories エンテゖテゖと Products エンテゖテゖのデー

タ モデルが追加されます。

1

1

2

O/R デザイナ

ドラッグ&ドロップ

Products エンテゖテゖ

Categories エンテゖテゖ

Page 24: SQL Server 2008 自習書シリーズ Nodownload.microsoft.com/.../SQL08_SelfLearning20_LINQ.pdf · sql server 2008 自習書 no.20 linq によるデータ ゕクセス入門 4 stteepp

SQL Server 2008 自習書 No.20 LINQ によるデータ ゕクセス入門

24

4. O/R デザナでは、次のように任意の領域を右クリックして、[ズーム]をクリックすると、

表示サズを変更することもできます。

5. 次に、Categories エンテゖテゖと Products エンテゖテゖが結ばれている「関連付け」

(Association)の線を右クリックして、[プロパティ]をクリックします。

これにより、画面右下へ[プロパティ]ウンドウが表示されて、Categories エンテゖテゖ

と Products エンテゖテゖが「1 対多」(OneToMany)のリレーション シップが設定されて

いることを確認できます。

このように、.dbml(Database Mapping Language)フゔルでは、SQL Server データベ

ース テーブルとオブジェクトの O/R マッピングをグラフゖカルにデザンすることがで

きます。

1

2

1

Categories エンテゖテゖとProducts エンテゖテゖの間に1対多 のリレーション シップ

があることを示す

Page 25: SQL Server 2008 自習書シリーズ Nodownload.microsoft.com/.../SQL08_SelfLearning20_LINQ.pdf · sql server 2008 自習書 no.20 linq によるデータ ゕクセス入門 4 stteepp

SQL Server 2008 自習書 No.20 LINQ によるデータ ゕクセス入門

25

2.4 LINQ による単純な SELECT ステートメントの実行

単純な SELECT ステートメントの実行

次に、LINQ to SQL プロバダを利用して、単純な SELECT ステートメントを実行するコード

を記述していきましょう。前の手順で作成した .dbml フゔル(LINQ to SQL クラス)は、サ

ーバー エクスプローラから SQL Server 上のテーブルをドラッグ&ドロップすることで、LINQ

to SQL プロバダとして機能する「DataContext」クラスが自動生成されています。このクラ

スの名前は、自動的に「ファイル名 DataContext」となり、今回はデフォルトのフゔル名を付

けているので、「DataClasses1DataContext」という名前で生成されています。

記述するコードの完成系(全 6 行)は、次のとおりです(以降で 1 つずつ説明していきます)。

Sub Main()

Dim northdc As New DataClasses1DataContext()

Dim cate = From c In northdc.Categories _

Select c.CategoryID, c.CategoryName

For Each c In cate

Console.WriteLine(c.CategoryID & ":" & c.CategoryName)

Next

End Sub

1. まずは、コードを記述するために、[ソリューション エクスプローラ]で[Module1.vb]

フゔルをダブル クリックして、コード エデゖタを開きます。

Module1.vb をダブル クリック

1

コード エデゖタへコードを記述

Page 26: SQL Server 2008 自習書シリーズ Nodownload.microsoft.com/.../SQL08_SelfLearning20_LINQ.pdf · sql server 2008 自習書 no.20 linq によるデータ ゕクセス入門 4 stteepp

SQL Server 2008 自習書 No.20 LINQ によるデータ ゕクセス入門

26

DataContext クラスのインスタンス化

最初に記述するコードは、DataContext クラスのンスタンス化です。このクラスは、前述した

ように「DataClasses1DataContext」という名前で自動生成されています。

2. DataClasses1DataContext クラスをンスタンス化するには、次のように記述します。

Dim northdc As New DataClasses1DataContext()

northdc は、オブジェクト変数なので、任意の名前を付けられます。

LINQ による Categories テーブルに対するクエリ

次に、LINQ クエリを記述して、Categories エンテゖテゖ(商品カテゴリ)に対するクエリを記

述します。

3. LINQ クエリは、SQL ステートメントでお馴染みの Select や From などとよく似た構文で

記述できます。次のように記述すると、Categories エンテゖテゖから CategoryID(カテ

ゴリ番号)と CategoryName(カテゴリ名)を取得できるようになります。

Dim cate = From c In northdc.Categories Select c.CategoryID, c.CategoryName

ンテリセンスで DataContext クラスが表示される

ンテリセンスでエンテゖテゖの一覧が表示される

Page 27: SQL Server 2008 自習書シリーズ Nodownload.microsoft.com/.../SQL08_SelfLearning20_LINQ.pdf · sql server 2008 自習書 no.20 linq によるデータ ゕクセス入門 4 stteepp

SQL Server 2008 自習書 No.20 LINQ によるデータ ゕクセス入門

27

SQL ステートメントとは、Select と From の順序が逆で、まず From 句でエンテゖテゖ

を指定した後に、どの列を取得するかを Select 句で指定します。LINQ では、From 句で始

まり、Select 句を最後へ記述します。その間には、Order By 句や Where 句などを記述で

きますが、これについては、次の Step 以降で説明します。

LINQ の From 句では、In キーワードでゕクセス対象となる DataContext オブジェクト

のエンテゖテゖを指定し、それを範囲変数へ格納します(今回は、範囲変数の名前を「c」と

していますが、任意の名前を設定できます)。Select 句では、範囲変数を利用して、取得し

たい列名を「c.CategoryID」のように指定します。この列名もンテリセンスで一覧表示さ

れます。

LINQ で取得した結果は、「Dim cate=」で宣言した変数(コレクション)へ格納されます。

LINQ は、次のように、From 句や Select 句ごとに、複数行に分けて記述( _ で改行)し

たほうが分かりやすくなります(以降では、句の区切りへ改行を入れて説明していきます)。

Dim cate = From c In northdc.Categories _

Select c.CategoryID, c.CategoryName

このように LINQ では、ほとんどのコードをンテリセンスが補ってくれるので、実際に記

述するコードは非常に少なく済みます。もし、ンテリセンスで候補の一覧が表示されない場

合は、何かが間違っている場合(DataContext クラスの名前の指定を間違っていたり、New

でンスタンスを生成していなかったりなど)なので、文法的に正しく記述できているかどう

かを確認する目的でもンテリセンスが役立ちます。

クエリ結果の取得

LINQ クエリの結果を取得するには、For Each ステートメント(VB でコレクションを操作する

LINQ で利用できるキーワード

ンテリセンスで列名の一覧も表示される

Page 28: SQL Server 2008 自習書シリーズ Nodownload.microsoft.com/.../SQL08_SelfLearning20_LINQ.pdf · sql server 2008 自習書 no.20 linq によるデータ ゕクセス入門 4 stteepp

SQL Server 2008 自習書 No.20 LINQ によるデータ ゕクセス入門

28

ためのステートメント)を利用します。

4. For Each ステートメントを次のように使用して、LINQ クエリで取得した CategoryID と

CategoryName の値をコンソールへ出力(Console.WriteLine)するようにしてみましょ

う。

For Each c In cate

Console.WriteLine( c.CategoryID & ":" & c.CategoryName )

Next

以上で、コードの記述が完了です。完成版は、次のようになります。

実行

5. 次に、[デバッグ]メニューの[デバッグなしで開始」をクリックして、コンソール ゕプリケ

ーションを実行してみましょう。

LINQ で取得した列名もンテリセンスで表示される

完成版

1

Page 29: SQL Server 2008 自習書シリーズ Nodownload.microsoft.com/.../SQL08_SelfLearning20_LINQ.pdf · sql server 2008 自習書 no.20 linq によるデータ ゕクセス入門 4 stteepp

SQL Server 2008 自習書 No.20 LINQ によるデータ ゕクセス入門

29

コンソール ゕプリケーションが実行されて、Northwind データベースの Categories テー

ブルのデータ(8 件)が表示されていることを確認できます。

SQL Server の Management Studio で確認した Categories テーブルの内容と一致して

いることを確認しておきましょう。

Categories テーブルのCategoryID と

Categoryname の一覧を取得

Categories テーブルのCategoryID と

Categoryname の一覧を取得

Categories テーブルを右クリックして「上位 1000 行の選択」をクリック

1

Categories テーブル内の商品カテゴリの一覧

Page 30: SQL Server 2008 自習書シリーズ Nodownload.microsoft.com/.../SQL08_SelfLearning20_LINQ.pdf · sql server 2008 自習書 no.20 linq によるデータ ゕクセス入門 4 stteepp

SQL Server 2008 自習書 No.20 LINQ によるデータ ゕクセス入門

30

SSTTEEPP 33.. LLIINNQQ ttoo SSQQLL ププロロババダダでで

自自動動生生成成さされれるる SSQQLL のの確確認認

この STEP では、O/R デザナによって生成される DataContext クラスを通し

てゕクセスされる、LINQ to SQL プロバダ役割と動作を説明します。

この STEP では、次のことを学習します。

LINQ to SQL プロバダ によって自動生成される SQL の確認方法

LINQ クエリの Select 句で列を指定した場合に生成される SQL

LINQ クエリの Select 句で列を指定しなかった場合に生成される SQL

Page 31: SQL Server 2008 自習書シリーズ Nodownload.microsoft.com/.../SQL08_SelfLearning20_LINQ.pdf · sql server 2008 自習書 no.20 linq によるデータ ゕクセス入門 4 stteepp

SQL Server 2008 自習書 No.20 LINQ によるデータ ゕクセス入門

31

3.1 作成するアプリケーション

この STEP で作成するアプリケーション

この STEP では、DataContext クラスによって自動生成される SQL ステートメントを確認す

る方法を説明します。DataContext クラスは、LINQ to SQL プロバイダとして動作し、LINQ ク

エリによる呼び出しを SQL ステートメント(Transact-SQL)へ変換して、SQL Server へ発行

します。DataContext クラスが生成する SQL ステートメントは、DataContext オブジェクトの

Log プロパテゖを設定することで確認することができます。

LINQ to SQL プロバダが自動生成した SQL ステートメント

Page 32: SQL Server 2008 自習書シリーズ Nodownload.microsoft.com/.../SQL08_SelfLearning20_LINQ.pdf · sql server 2008 自習書 no.20 linq によるデータ ゕクセス入門 4 stteepp

SQL Server 2008 自習書 No.20 LINQ によるデータ ゕクセス入門

32

3.2 LINQ to SQL プロバイダで自動生成される SQL の確認

自動生成される SQL の確認

ここでは、前の Step で作成したコンソール ゕプリケーション(ConsoleApplication1)を利

用して、自動生成される SQL を確認してみましょう。

1. 前の Step のコンソール ゕプリケーションを閉じている場合は、Visual Studio の[ファイ

ル]メニューの[開く]→[プロジェクト/ソリューション]から「ConsoleApplication1.sln」

フゔルを選択して、開いてください。

2. プロジェクトを開いたら、Module1.vb フゔルへ次の 1 行を追加します。

northdc.Log = Console.Out

DataContext オブジェクト(northdc)の Log プロパテゖへ、「Console.Out」と設定す

ることで、LINQ to SQL プロバダによって自動生成された SQL をコンソールへ出力でき

るようになります。

3. コードを記述後、[デバッグ]メニューの[デバッグなしで開始]をクリックします。

1

2

この 1行を追加1

内部実行された SQL が出力される

1

Page 33: SQL Server 2008 自習書シリーズ Nodownload.microsoft.com/.../SQL08_SelfLearning20_LINQ.pdf · sql server 2008 自習書 no.20 linq によるデータ ゕクセス入門 4 stteepp

SQL Server 2008 自習書 No.20 LINQ によるデータ ゕクセス入門

33

コンソールの先頭には、LINQ to SQL プロバダによって自動生成された SQL が出力され

ていることを確認できます。

SELECT [t0].[CategoryID], [t0].[CategoryName]

FROM [dbo].[Categories] AS [t0]

-- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 3.5.30428.1

SELECT ステートメントの選択リストは、CategoryID と CategoryName 列のみが指定さ

れていることを確認できます。

Select 句で列を指定しなかった場合の内部動作

次に、LINQ クエリで選択リストを指定しなかった場合の内部動作を確認してみましょう。

1. LINQ クエリで選択リストを指定しなようにするには、Select 句を次のように変更します。

Dim cate = From c In northdc.Categories _

Select c

Select 句で範囲変数「c」のみを指定すると、すべての列を取得するという意味になります。

2. ほかのコードは変更せずに、[デバッグ]メニューの[デバッグなしで開始]をクリックして、

結果を確認します。

1

Select 句を変更

Categories テーブルのすべての列が取得されている

Page 34: SQL Server 2008 自習書シリーズ Nodownload.microsoft.com/.../SQL08_SelfLearning20_LINQ.pdf · sql server 2008 自習書 no.20 linq によるデータ ゕクセス入門 4 stteepp

SQL Server 2008 自習書 No.20 LINQ によるデータ ゕクセス入門

34

結果(内部発行されている SQL)は、Categories テーブルのすべての列が取得されているこ

とを確認できます。

SELECT [t0].[CategoryID], [t0].[CategoryName], [t0].[Description], [t0].[Picture]

FROM [dbo].[Categories] AS [t0]

-- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 3.5.30428.1

Select 句で、列名を指定しない場合は、このようにすべての列が取得されてしまうので、効

率の悪い検索になります。余分なデータが SQL Server からゕプリケーションへ転送されて

しまうからです。したがって、Select 句では、ゕプリケーションで必要な列のみを明示的に

絞り込むことをお勧めします。

以上のように LINQ では、自動的に内部発行する SQL を、クエリに応じて動的に変更し、

その SQL は Log プロパテゖを設定することで、確認することができます。

以降の Step では、LINQ クエリで利用できる Order By 句(並べ替え)や Where 句(絞

り込み条件)などを説明していきます。

Page 35: SQL Server 2008 自習書シリーズ Nodownload.microsoft.com/.../SQL08_SelfLearning20_LINQ.pdf · sql server 2008 自習書 no.20 linq によるデータ ゕクセス入門 4 stteepp

SQL Server 2008 自習書 No.20 LINQ によるデータ ゕクセス入門

35

SSTTEEPP 44.. デデーータタのの並並べべ替替ええ

((OOrrddeerr BByy 句句))

この STEP では、Windows フォームで LINQ を利用する方法と、LINQ でのデ

ータの並べ替え方法(Order By 句の利用方法)を説明します。

この STEP では、次のことを学習します。

Windows フォームで LINQ を利用する方法

DataGridView コントロールへのデータ バンド

Order By 句の指定方法

DataContext オブジェクトによって自動生成される SQL の確認

Page 36: SQL Server 2008 自習書シリーズ Nodownload.microsoft.com/.../SQL08_SelfLearning20_LINQ.pdf · sql server 2008 自習書 no.20 linq によるデータ ゕクセス入門 4 stteepp

SQL Server 2008 自習書 No.20 LINQ によるデータ ゕクセス入門

36

4.1 作成するアプリケーション

作成するアプリケーション

この STEP では、Windows フォーム ゕプリケーションから LINQ を利用して、クエリ結果を

DataGridView コントロールへ表示する方法を説明します。また、LINQ の Order By 句を利

用して、結果を並べ替える方法も説明します。

CategoryID の大きい順に並べ替えて表示

DataGridView へ結果を表示 Order By 句で結果を並べ替えて表示

Page 37: SQL Server 2008 自習書シリーズ Nodownload.microsoft.com/.../SQL08_SelfLearning20_LINQ.pdf · sql server 2008 自習書 no.20 linq によるデータ ゕクセス入門 4 stteepp

SQL Server 2008 自習書 No.20 LINQ によるデータ ゕクセス入門

37

4.2 プロジェクトの新規作成と LINQ to SQL クラスの作成

プロジェクトの新規作成

この STEP では、Windows フォーム ゕプリケーションを作成して、LINQ の動作を確認します。

1. まずは、Visual Studio 2008 を起動して、[ファイル]メニューの[新規作成]から[プロ

ジェクト]をクリックします。

2. [新しいプロジェクト]ダゕログでは、[プロジェクトの種類」で[Visual Basic]を選択

し、[テンプレート]で[Windows フォーム アプリケーション]を選択します。

[プロジェクト名]は、「WinVarQuery」へ変更(任意の名前を設定可能)して、[OK]ボ

タンをクリックします。

3. これにより、Form1.vb フゔルがデザン ビューで開かれます。

1

2

1

2

3

4

Page 38: SQL Server 2008 自習書シリーズ Nodownload.microsoft.com/.../SQL08_SelfLearning20_LINQ.pdf · sql server 2008 自習書 no.20 linq によるデータ ゕクセス入門 4 stteepp

SQL Server 2008 自習書 No.20 LINQ によるデータ ゕクセス入門

38

LINQ to SQL クラスの作成(.dbml ファイルの作成)

次に、LINQ to SQL クラスを作成します。

4. まずは、ソリューション エクスプローラでプロジェクトを右クリックして、[追加]の[新し

い項目の追加]をクリックします。

これは、[プロジェクト]メニューの[新しい項目の追加]と同じ動作です。

5. [新しい項目の追加]ダゕログが表示されたら、[テンプレート]から「LINQ to SQL ク

ラス」を選択します。

Form1.vb がデザン ビューで開かれる

2

1

Page 39: SQL Server 2008 自習書シリーズ Nodownload.microsoft.com/.../SQL08_SelfLearning20_LINQ.pdf · sql server 2008 自習書 no.20 linq によるデータ ゕクセス入門 4 stteepp

SQL Server 2008 自習書 No.20 LINQ によるデータ ゕクセス入門

39

フゔル名を、今回は「Northwind.dbml」へ変更して、[追加]ボタンをクリックします。

6. [O/R デザイナ]が表示されたら、サーバー エクスプローラから「Categories」テーブル

をドラッグ&ドロップして、エンテゖテゖを作成します。

DataGridView コントロールの配置

次に、LINQ で取得した結果を表示するために、Windows フォーム上へ DataGridView コント

ロールを配置します。

7. まずは、次のように「Form1.vb」フゔルをダブル クリックして、フォーム デザナを開

きます。

1

2

3

1

O/R デザイナ

ドラッグ&ドロップ

Categories エンテゖテゖ

Page 40: SQL Server 2008 自習書シリーズ Nodownload.microsoft.com/.../SQL08_SelfLearning20_LINQ.pdf · sql server 2008 自習書 no.20 linq によるデータ ゕクセス入門 4 stteepp

SQL Server 2008 自習書 No.20 LINQ によるデータ ゕクセス入門

40

フォーム デザナを開いたら、[表示]メニューの[ツールボックス]をクリックして、ツー

ルボックスを表示します。

8. 続いて、ツールボックスの[データ]セクションから[DataGridView]コントロールをフ

ォーム(Form1.vb)上へドラッグ&ドロップします。

LINQ クエリの記述

次に、LINQ クエリで Categories テーブルのデータを取得して、それを DataGridView コント

ロールへ表示するためのコードを記述します。

2

3

「Form1.vb」をダブル クリック

1

フォーム デザイナ

ツール ボックス

1

2

ドラッグ&ドロップ

Page 41: SQL Server 2008 自習書シリーズ Nodownload.microsoft.com/.../SQL08_SelfLearning20_LINQ.pdf · sql server 2008 自習書 no.20 linq によるデータ ゕクセス入門 4 stteepp

SQL Server 2008 自習書 No.20 LINQ によるデータ ゕクセス入門

41

9. まずは、次のようにフォーム(Form1.vb)上の任意の領域をダブル クリックします。

これにより、コード エデゖタが開き、Form の Load ベント ハンドラ(Form1_Load)

が自動生成されます。

10. 次に、Form1_Load ベント ハンドラへ、Categories テーブルからデータを取得するた

めの LINQ クエリを記述します。

Private Sub Form1_Load( … )

Dim Northwind As New NorthwindDataContext()

Northwind.Log = Console.Out

Dim cate = From c In Northwind.Categories _

Select c.CategoryID, c.CategoryName

DataGridView1.DataSource = cate

End Sub

このコードは、前の Step で試したのとほとんど同じです。DataContext クラスの名前を

「NorthwindDataContext」としているのは、手順 5 で LINQ to SQL クラス(.dbml フ

ゔル)の名前を「Northwind.dbml」としているためです。

そのほかは、「NorthwindDataContext」クラスのオブジェクト変数の名前を「Northwind」

(前の Step では northdc)としているのが、前の Step との違いです。

最後の 1 行は、DataGridView1 コントロールの DataSource プロパテゖへ、LINQ クエ

リの結果を受け取った変数「cate」を割り当てることで、クエリ結果を DataGridView へデ

ータ バンドしています。

11. コードの記述が完了したら、[デバッグ]メニューの[デバッグ開始]をクリックして、結果

を確認してみましょう。

フォーム上の任意の領域をダブル クリック

1

Form の Load ベント ハンドラが自動生成される

Page 42: SQL Server 2008 自習書シリーズ Nodownload.microsoft.com/.../SQL08_SelfLearning20_LINQ.pdf · sql server 2008 自習書 no.20 linq によるデータ ゕクセス入門 4 stteepp

SQL Server 2008 自習書 No.20 LINQ によるデータ ゕクセス入門

42

Categories テーブルのデータが DataGridView へ表示されることを確認できます。

12. 確認後、画面右下の[出力]ウンドウを参照すると、内部的に発行された SQL ステートメ

ントを確認することができます。

出力ウンドウが表示されない場合は、[表示]メニューの[出力]をクリックして表示する

1

Categories テーブルのカテゴリ一覧を取得

1

2 Windows フォームではDataContext.Log の結果が出力ウインドウへ表示される

Page 43: SQL Server 2008 自習書シリーズ Nodownload.microsoft.com/.../SQL08_SelfLearning20_LINQ.pdf · sql server 2008 自習書 no.20 linq によるデータ ゕクセス入門 4 stteepp

SQL Server 2008 自習書 No.20 LINQ によるデータ ゕクセス入門

43

ことができます。

13. 結果を確認後、フォームを終了して、デバッグを終了します。

Order By 句による並べ替え

次に、LINQ クエリへ Order By 句を追加して、結果を並べ替えて、取得してみましょう。

1. コード エデゖタを開いて、次のように From 句と Select 句の間へ、Order By 句を記述し

ます。

Dim cate = From c In Northwind.Categories _

Order By c.CategoryID Descending _

Select c.CategoryID, c.CategoryName

LINQ クエリは、From 句で始まり、Select 句を最後へ記述するので、Order By や Where

など他の句は、その間へ記述する必要があります。また、LINQ クエリは、VB では 1 行内

へ記述する必要があるので、改行を入れる場合は、「_」を忘れずに記述するようにします。

Order By 句で指定した Descending は、SQL ステートメントでの DESC キーワードに相

当する役割で、降順(Descending:大 → 小)で並べ替えるという意味です。Descending を

省略した場合は、昇順(Ascending:小 → 大)で並べ替えられます。

2. コードの記述が完了したら、[デバッグ]メニューの[デバッグ開始]をクリックして、結果

を確認してみましょう。

結果は、CategoryID の大きい順に並べ替えられていることを確認できます。

3. 確認後、[出力]ウンドウを参照して、内部的に発行された SQL ステートメントを確認し

1

CategoryID の大きい順に並べ替えられている

Order By 句を追加

Page 44: SQL Server 2008 自習書シリーズ Nodownload.microsoft.com/.../SQL08_SelfLearning20_LINQ.pdf · sql server 2008 自習書 no.20 linq によるデータ ゕクセス入門 4 stteepp

SQL Server 2008 自習書 No.20 LINQ によるデータ ゕクセス入門

44

ます。

自動生成された SQL へ「ORDER BY [t0].[CategoryID] DESC」が追加されていることを

確認できます。

SELECT [t0].[CategoryID], [t0].[CategoryName]

FROM [dbo].[Categories] AS [t0]

ORDER BY [t0].[CategoryID] DESC

-- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 3.5.30428.1

このように LINQ クエリで Order By 句を利用した場合は、内部的には、SQL ステートメ

ントの ORDER BY 句へ自動変換されて実行されています。

4. 最後に、Windows フォームを終了して、デバッグを終了しておきます。

1

2ORDER BY が追加されている

Page 45: SQL Server 2008 自習書シリーズ Nodownload.microsoft.com/.../SQL08_SelfLearning20_LINQ.pdf · sql server 2008 自習書 no.20 linq によるデータ ゕクセス入門 4 stteepp

SQL Server 2008 自習書 No.20 LINQ によるデータ ゕクセス入門

45

SSTTEEPP 55.. 条条件件指指定定にによよるる行行のの絞絞りり込込みみ

((WWhheerree 句句))

この STEP では、LINQ での条件指定による行の絞り込み方法(Where 句の利用

方法)を説明します。

この STEP では、次のことを学習します。

Where 句の利用方法

取得した結果の DataGridView コントロールへのバンド

Page 46: SQL Server 2008 自習書シリーズ Nodownload.microsoft.com/.../SQL08_SelfLearning20_LINQ.pdf · sql server 2008 自習書 no.20 linq によるデータ ゕクセス入門 4 stteepp

SQL Server 2008 自習書 No.20 LINQ によるデータ ゕクセス入門

46

5.1 作成するアプリケーション

作成するアプリケーション

この STEP では、前の Step で作成した Windows フォーム ゕプリケーションへ[検索]ボタ

ンを追加して、CategoryID(カテゴリ番号)で検索できるように変更します。

検索には、LINQ の Where 句を利用して、テキスト ボックスへ入力された CategoryID でデー

タを絞り込めるようにします。

CategoryID を入力

[検索]ボタン

Page 47: SQL Server 2008 自習書シリーズ Nodownload.microsoft.com/.../SQL08_SelfLearning20_LINQ.pdf · sql server 2008 自習書 no.20 linq によるデータ ゕクセス入門 4 stteepp

SQL Server 2008 自習書 No.20 LINQ によるデータ ゕクセス入門

47

5.2 LINQ による行の絞り込み: Where 句

コントロールの配置

まずは、検索条件を入力するためのテキスト ボックスとボタン、ラベルを Windows フォーム上

へ配置します。

1. 前の Step で作成した Windows フォームを閉じている場合は、Visual Studio の[ファイ

ル]メニューの[開く]→[プロジェクト/ソリューション]から「WinVarQuery.sln」フ

ゔルを選択して、開いてください。

2. プロジェクトを開いたら、ソリューション エクスプローラで Form1.vb フゔルをダブル

クリックして、フォーム デザナを開きます。

3. 次に、ツールボックスの[コモン コントロール]セクションから「Label」コントロールを

フォーム(Form1.vb)上へドラッグ&ドロップします。

続いて、配置した Label コントロールを選択した状態で、画面右下の[プロパテゖ]ウン

ドウを開きます。表示されたプロパテゖの一覧から、[Text]プロパテゖを選択して、

「Form1.vb」をダブル クリック

1

フォーム デザイナ

Label コントロールをフォームへ配置

配置した Label を選択した状態で、画面右下の「プロパティ」ウンドウを参照

3

「プロパティ」ウインドウ

Text プロパテゖをCategoryID へ変更

2

4

1

Page 48: SQL Server 2008 自習書シリーズ Nodownload.microsoft.com/.../SQL08_SelfLearning20_LINQ.pdf · sql server 2008 自習書 no.20 linq によるデータ ゕクセス入門 4 stteepp

SQL Server 2008 自習書 No.20 LINQ によるデータ ゕクセス入門

48

「CategoryID」へ変更します。

4. 次に、ツールボックスから「TextBox」コントロールをフォーム(Form1.vb)上へドラッグ

&ドロップします。

配置した TextBox コントロールを選択した状態で、画面右下の[プロパテゖ]ウンドウを

開き、(Name) プロパテゖを「txtCategoryID」へ変更します。

5. 次に、ツールボックスから「Button」コントロールをフォーム(Form1.vb)上へドラッグ

&ドロップします。

配置した Button コントロールを選択した状態で、画面右下の[プロパテゖ]ウンドウを

開き、(Name) プロパテゖを「btnSearchCategoryID」へ変更します。変更後、[Text]

プロパテゖを「Search CategoryID」へ変更します。

LINQ クエリへ行の選択条件を指定

次に、LINQ クエリを記述し、行の選択条件(絞り込み条件)を指定するようにします。

6. フォームへ配置した Button コントロール(btnSearchCategoryID)をダブル クリック

1

2

3

1

2

3

Page 49: SQL Server 2008 自習書シリーズ Nodownload.microsoft.com/.../SQL08_SelfLearning20_LINQ.pdf · sql server 2008 自習書 no.20 linq によるデータ ゕクセス入門 4 stteepp

SQL Server 2008 自習書 No.20 LINQ によるデータ ゕクセス入門

49

して、Click ベント ハンドラ(btnSearchCategoryID_Click)を生成します。

7. 次に、btnSearchCategoryID_Click ベント ハンドラへ、Form1_Load ベント ハ

ンドラ内のコードをコピー&ペーストします。

8. 続いて、btnSearchCategoryID_Click ベント ハンドラへ貼り付けた LINQ クエリの

From 句と Order By 句の間へ、Where 句を追加して、CategoryID で絞り込むように変

更します。

Private Sub btnSearchCategoryID_Click( … )

Dim Northwind As New NorthwindDataContext()

Northwind.Log = Console.Out

Dim cate = From c In Northwind.Categories _

Where c.CategoryID = txtCategoryID.Text _

Order By c.CategoryID Descending _

Select c.CategoryID, c.CategoryName

ボタンをダブルクリック

1

ボタンの Click ベントハンドラが生成される

丸ごとコピーして貼り付け

1

Page 50: SQL Server 2008 自習書シリーズ Nodownload.microsoft.com/.../SQL08_SelfLearning20_LINQ.pdf · sql server 2008 自習書 no.20 linq によるデータ ゕクセス入門 4 stteepp

SQL Server 2008 自習書 No.20 LINQ によるデータ ゕクセス入門

50

DataGridView1.DataSource = cate

End Sub

これにより、テキスト ボックスへ入力された値(txtCategoryID.Text)をもとに CategoryID

で絞り込めるようになります。

9. コードの記述が完了したら、[デバッグ]メニューの[デバッグ開始]をクリックして、Windows

フォームを実行します。

テキストボックスへ「3」と入力して、ボタンをクリックします。これにより、DataGridView

コントロールへ CategoryID=3 の Confections(糖菓)カテゴリのみが表示されることを

確認できます。

10. 次に、[出力]ウンドウを確認します。

内部発行された SQL へ WHERE 句が追加され、入力値がパラメータ化(@p0)されている

ことを確認できます。

SELECT [t0].[CategoryID], [t0].[CategoryName]

FROM [dbo].[Categories] AS [t0]

WHERE (CONVERT(Float,[t0].[CategoryID])) = @p0

ORDER BY [t0].[CategoryID] DESC

-- @p0: Input Float (Size = 0; Prec = 0; Scale = 0) [3]

-- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 3.5.30729.1

ただし、この WHERE 句は、実は効率が悪い SQL です。テキストボックスへ入力された数

1 2

3

1

2WHERE が

追加されている

Page 51: SQL Server 2008 自習書シリーズ Nodownload.microsoft.com/.../SQL08_SelfLearning20_LINQ.pdf · sql server 2008 自習書 no.20 linq によるデータ ゕクセス入門 4 stteepp

SQL Server 2008 自習書 No.20 LINQ によるデータ ゕクセス入門

51

値は、デフォルトで float 型と解釈されるので、CONVERT(Float, [t0].[CategoryID]) と

関数処理が入ってしまっています(パラメータ @p0 のデータ型が Float 型と解釈されてい

ます)。

CategoryID 列は、SQL Server 側で int データ型(32 ビットの 4 バト整数)として定

義されているので、テキストボックスへ入力された数値は、次のように Int32.Parse を利

用して 4 バト整数へ変換しておくようにします。

Dim cate = From c In Northwind.Categories _

Where c.CategoryID = Int32.Parse( txtCategoryID.Text ) _

Order By c.CategoryID Descending _

Select c.CategoryID, c.CategoryName

DataGridView1.DataSource = cate

このように変換することで、LINQ to SQL プロバダによって、内部発行される SQL が次

のように効率の良い形へ変換されるようになります。

SELECT [t0].[CategoryID], [t0].[CategoryName]

FROM [dbo].[Categories] AS [t0]

WHERE [t0].[CategoryID] = @p0

ORDER BY [t0].[CategoryID] DESC

-- @p0: Input Int (Size = 0; Prec = 0; Scale = 0) [3]

-- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 3.5.30729.1

今度は、CONVERT 処理が行われず、パラメータ @p0 のデータ型も正しく Int 型と解釈

されていることを確認できます。

Note: LINQ のメリットは No SQL?

LINQ のメリットは、No SQL(SQL ステートメントを書かなくても良い)と言われることがありますが、確かに

SQL ステートメントを書く必要はありませんが、パフォーマンスの良いゕプリケーションを作成するには、内部

発行された SQL を理解する知識が重要になります。

2 効率の良い WHEREへ変換される

Page 52: SQL Server 2008 自習書シリーズ Nodownload.microsoft.com/.../SQL08_SelfLearning20_LINQ.pdf · sql server 2008 自習書 no.20 linq によるデータ ゕクセス入門 4 stteepp

SQL Server 2008 自習書 No.20 LINQ によるデータ ゕクセス入門

52

SSTTEEPP 66.. 前前方方一一致致とと部部分分一一致致にによよるる検検索索

この STEP では、LINQ クエリの Where 句で「前方一致」(プレフゖックス)検

索と「部分一致」(パターン)検索を実行するための検索条件を指定する方法を説

明します。

この STEP では、次のことを学習します。

前方一致を指定する StartsWith メソッドの利用

部分一致を指定する Contains メソッドの利用

Page 53: SQL Server 2008 自習書シリーズ Nodownload.microsoft.com/.../SQL08_SelfLearning20_LINQ.pdf · sql server 2008 自習書 no.20 linq によるデータ ゕクセス入門 4 stteepp

SQL Server 2008 自習書 No.20 LINQ によるデータ ゕクセス入門

53

6.1 作成するアプリケーション

この STEP で作成するアプリケーション

この STEP では、前の Step で作成した Windows フォームへ、検索ボタンを 2 つとテキスト

ボックスを追加して、CategoryName(商品カテゴリ名)で、「前方一致」(プレフゖックス)検

索または「部分一致」(パターン)検索を実行できるようにします。

LINQ の Where 句では、文字列検索用のメソッドとして、StartsWith と Contains、

EndsWith の 3 つが用意されています。

CategoryName の一部の文字を入力できるテキスト

ボックス

前方一致の検索ボタン

部分一致(キーワード検索)の検索ボタン

条件にヒットした結果のみ表示

Page 54: SQL Server 2008 自習書シリーズ Nodownload.microsoft.com/.../SQL08_SelfLearning20_LINQ.pdf · sql server 2008 自習書 no.20 linq によるデータ ゕクセス入門 4 stteepp

SQL Server 2008 自習書 No.20 LINQ によるデータ ゕクセス入門

54

6.2 LINQ での文字列検索(StatsWith、Contains)

コントロールの配置

まずは、検索条件を入力するためのテキスト ボックスとボタン、ラベルを Windows フォーム上

へ配置します。

1. 前の Step で作成した Windows フォームを閉じている場合は、Visual Studio の[ファイ

ル]メニューの[開く]→[プロジェクト/ソリューション]から「WinVarQuery.sln」を

選択して、開いてください。

2. プロジェクトを開いたら、ソリューション エクスプローラで Form1.vb フゔルをダブル

クリックして、フォーム デザナを開きます。

3. 次に、ツールボックスの[コモン コントロール]セクションから「Label」コントロールを

フォーム(Form1.vb)上へドラッグ&ドロップします。

配置した Label コントロールを選択した状態で、画面右下の[プロパテゖ]ウンドウを開

き、[Text]プロパテゖを選択して、「CategoryName」へ変更します。

4. 次に、ツールボックスから「TextBox」コントロールをフォーム(Form1.vb)上へドラッグ

「Form1.vb」をダブル クリック

1

フォーム デザイナ

1 2

3

Page 55: SQL Server 2008 自習書シリーズ Nodownload.microsoft.com/.../SQL08_SelfLearning20_LINQ.pdf · sql server 2008 自習書 no.20 linq によるデータ ゕクセス入門 4 stteepp

SQL Server 2008 自習書 No.20 LINQ によるデータ ゕクセス入門

55

&ドロップします。

配置した TextBox コントロールを選択した状態で、画面右下の[プロパテゖ]ウンドウを

開き、(Name) プロパテゖを「txtCategoryName」へ変更します。

5. 次に、ツールボックスから「Button」コントロールをフォーム(Form1.vb)上へドラッグ

&ドロップします。

配置した Button コントロールを選択した状態で、画面右下の[プロパテゖ]ウンドウを

開き、(Name) プロパテゖを「btnFwSearch」へ変更します。変更後、[Text]プロパテ

ゖを「Foward」へ変更します。

6. 次に、ツールボックスから、もう 1 つ「Button」コントロールをフォーム(Form1.vb)上

へドラッグ&ドロップします。

1

2

3

1

2

3

Page 56: SQL Server 2008 自習書シリーズ Nodownload.microsoft.com/.../SQL08_SelfLearning20_LINQ.pdf · sql server 2008 自習書 no.20 linq によるデータ ゕクセス入門 4 stteepp

SQL Server 2008 自習書 No.20 LINQ によるデータ ゕクセス入門

56

配置した Button コントロールを選択した状態で、画面右下の[プロパテゖ]ウンドウを

開き、(Name) プロパテゖを「btnPtSearch」へ変更します。変更後、[Text]プロパテゖ

を「Pattern」へ変更します。

LINQ クエリへ行の選択条件を指定

次に、LINQ クエリを記述し、行の選択条件(絞り込み条件)を指定するようにします。

7. フォームへ配置した、1 つ目の Button コントロール(btnFwSearch)をダブル クリック

して、Click ベント ハンドラ(btnFwSearch_Click)を生成します。

8. 次に、btnFwSearch_Click ベント ハンドラへ、btnSearchCategoryID_Click ベ

ント ハンドラ内のコードをコピー&ペーストします。

1

3

2

1

Page 57: SQL Server 2008 自習書シリーズ Nodownload.microsoft.com/.../SQL08_SelfLearning20_LINQ.pdf · sql server 2008 自習書 no.20 linq によるデータ ゕクセス入門 4 stteepp

SQL Server 2008 自習書 No.20 LINQ によるデータ ゕクセス入門

57

前方一致(プレフィックス)検索: StartsWith

9. 次に、商品カテゴリ名で、前方一致検索が実行できるように StartsWith メソッドを利用し

て、Where 句を変更します。btnFwSearch_Click ベント ハンドラへ貼り付けた LINQ

クエリの Where 句へ StartsWith メソッド追加して、CategoryName で絞り込むように

変更します。

Private Sub btnSearchCategoryID_Click( … )

Dim Northwind As New NorthwindDataContext()

Northwind.Log = Console.Out

Dim cate = From c In Northwind.Categories _

Where c.CategoryName.StartsWith( txtCategoryName.Text ) _

Order By c.CategoryID Descending _

Select c.CategoryID, c.CategoryName

DataGridView1.DataSource = cate

End Sub

これにより、テキスト ボックスへ入力された値( txtCategoryName.Text)をもとに

CategoryName で前方一致(プレフゖックス)検索ができるようになります。

10. コードの記述が完了したら、[デバッグ]メニューの[デバッグ開始]をクリックして、Windows

フォームを実行します。

丸ごとコピーして貼り付け

1

Page 58: SQL Server 2008 自習書シリーズ Nodownload.microsoft.com/.../SQL08_SelfLearning20_LINQ.pdf · sql server 2008 自習書 no.20 linq によるデータ ゕクセス入門 4 stteepp

SQL Server 2008 自習書 No.20 LINQ によるデータ ゕクセス入門

58

CategoryName のテキストボックスへ「con」と入力して、ボタンをクリックします。これ

により、DataGridView コントロールへ CategoryName が con で始まる商品カテゴリ

(Confections と Condiments)のみが表示されることを確認できます。

11. 次に、[出力]ウンドウを確認します。

内部発行された SQL へ LIKE 演算子が追加され、入力値がパラメータ化(@p0)されてい

ることを確認できます。

SELECT [t0].[CategoryID], [t0].[CategoryName]

FROM [dbo].[Categories] AS [t0]

WHERE [t0].[CategoryName] LIKE @p0

ORDER BY [t0].[CategoryID] DESC

-- @p0: Input NVarChar (Size = 4; Prec = 0; Scale = 0) [con%]

-- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 3.5.30729.1

また、パラメータへ代入された値が「con%」となっていることから、「CategoryName LIKE

'con%'」という形で SQL が実行されたことが分かります。

このように、StartsWith メソッドを利用すると、LIKE 'xx%' 形式の検索条件を実行でき

るようになります。

1 2

3

1

2LIKE 'xxx%'が発行されている

Page 59: SQL Server 2008 自習書シリーズ Nodownload.microsoft.com/.../SQL08_SelfLearning20_LINQ.pdf · sql server 2008 自習書 no.20 linq によるデータ ゕクセス入門 4 stteepp

SQL Server 2008 自習書 No.20 LINQ によるデータ ゕクセス入門

59

部分一致(パターン)検索: Contains

次に、部分一致検索(パターン検索)が実行できるようにコードを記述します。

1. まずは、フォームへ配置した、2 つ目の Button コントロール(btnPtSearch)をダブル ク

リックして、Click ベント ハンドラ(btnPtSearch_Click)を生成します。

2. 次に、btnPtSearch_Click ベント ハンドラへ、btnFwSearch_Click ベント ハンド

ラ内のコードをコピー&ペーストします。

3. 続いて、商品カテゴリ名で、部分一致検索が実行できるように Contains メソッドを利用し

て、Where 句を変更します。btnPtSearch_Click ベント ハンドラへ貼り付けた LINQ

クエリの StartsWith の部分を Contains メソッドへ変更します。

Private Sub btnSearchCategoryID_Click( … )

Dim Northwind As New NorthwindDataContext()

1

丸ごとコピーして貼り付け

1

Page 60: SQL Server 2008 自習書シリーズ Nodownload.microsoft.com/.../SQL08_SelfLearning20_LINQ.pdf · sql server 2008 自習書 no.20 linq によるデータ ゕクセス入門 4 stteepp

SQL Server 2008 自習書 No.20 LINQ によるデータ ゕクセス入門

60

Northwind.Log = Console.Out

Dim cate = From c In Northwind.Categories _

Where c.CategoryName.Contains( txtCategoryName.Text ) _

Order By c.CategoryID Descending _

Select c.CategoryID, c.CategoryName

DataGridView1.DataSource = cate

End Sub

これにより、テキスト ボックスへ入力された値( txtCategoryName.Text)をもとに

CategoryName で部分一致検索(キーワード検索)ができるようになります。

4. コードの記述が完了したら、[デバッグ]メニューの[デバッグ開始]をクリックして、Windows

フォームを実行します。

CategoryName のテキストボックスへ「pro」と入力して、「Pattern」ボタンをクリックし

ます。これにより、DataGridView コントロールへ CategoryName に pro という文字が

含まれる商品カテゴリ(Produce と Dairy Products)が表示されることを確認できます。

5. 次に、[出力]ウンドウを確認します。

内部発行された SQL へ LIKE 演算子が追加され、入力値がパラメータ化(@p0)されてい

ることを確認できます。

SELECT [t0].[CategoryID], [t0].[CategoryName]

FROM [dbo].[Categories] AS [t0]

1 2

3

1

2LIKE '%xxx%'が発行されている

Page 61: SQL Server 2008 自習書シリーズ Nodownload.microsoft.com/.../SQL08_SelfLearning20_LINQ.pdf · sql server 2008 自習書 no.20 linq によるデータ ゕクセス入門 4 stteepp

SQL Server 2008 自習書 No.20 LINQ によるデータ ゕクセス入門

61

WHERE [t0].[CategoryName] LIKE @p0

ORDER BY [t0].[CategoryID] DESC

-- @p0: Input NVarChar (Size = 5; Prec = 0; Scale = 0) [%pro%]

-- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 3.5.30729.1

また、パラメータへ代入された値が「%pro%」となっていることから、「CategoryName

LIKE '%pro%'」という形で SQL が実行されたことが分かります。

このように、Contains メソッドを利用すると、LIKE '%xx%' 形式の検索条件を実行でき

るようになります。

Tips: Contains メソッドの多用に注意

Contains メソッドによるキーワード検索は、内部的にはンデックスが使用されないテーブル スキャン(全件検

索)になることに注意する必要があります。これに対して、StartsWith メソッドによる前方一致検索は、ンデ

ックスが使用されるので、パフォーマンスの良い検索が可能です(ンデックスを作成している場合)。

LINQ による文字列検索のまとめ

LINQ での文字列検索には、次の 3 種類のメソッドが利用できます。

手順内で試した StatsWith と Contains のほかに、後方一致検索が可能な EndsWith メソ

ッドも用意されています。このメソッドの利用方法は、ほかのメソッドとまったく同じです。

ただし、EndsWith メソッドもンデックスが使用されない効率の悪い検索になるので、注意

が必要です。

前の Step の Note でも説明しましたが、LINQ では、SQL ステートメントを利用しなくて

もデータ検索を実行できるようになりますが、パフォーマンスを考慮したゕプリケーションを

作成するには、SQL ステートメントの知識が重要になります。

メソッド 役割 内部実行される SQL インデックスの使用

StartsWith 前方一致検索 LIKE 'xxx%' 使用される

Contains 部分一致検索 LIKE '%xxx%' 使用されない

EndsWith 後方一致検索 LIKE '%xxx' 使用されない

Page 62: SQL Server 2008 自習書シリーズ Nodownload.microsoft.com/.../SQL08_SelfLearning20_LINQ.pdf · sql server 2008 自習書 no.20 linq によるデータ ゕクセス入門 4 stteepp

SQL Server 2008 自習書 No.20 LINQ によるデータ ゕクセス入門

62

Tips: LINQ での日付の検索時の注意点

Categories テーブルには、日付関連のデータが格納されていないので、自習書内では試しませんでしたが、LINQ では、

日付に関する検索も自動で SQL ステートメントを生成してくれます。これは、Employees(社員)や Orders(受注)

テーブルなどを利用して確認することができます。

たとえば、Employees(社員)の HireDate(入社日)が 1994 年のデータを取り出す場合は、次のように記述する

ことができます。

Dim Northwind As New NorthwindDataContext()

Northwind.Log = Console.Out

Dim emp = From em In Northwind.Employees _

Where em.HireDate.Value.Year = 1994 _

Select em.FirstName, em.HireDate

DataGridView1.DataSource = emp

このように datetime データ型の列では、Year プロパテゖへ年の値を指定するだけで、その年に該当するデータを取

得できるようになります。しかし、このときに内部実行される SQL には、注意する必要があります。

「出力」ウンドウには、次の SQL が記録されます。

SELECT [t0].[FirstName], [t0].[HireDate] FROM [dbo].[Employees] AS [t0]

WHERE DATEPART(Year, [t0].[HireDate]) = @p0

-- @p0: Input Int (Size = 0; Prec = 0; Scale = 0) [1994] -- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 3.5.30729.1

DATEPART 関数で HireDate を処理してしまっているところがポントです。このように関数処理が行われる場合は、

ンデックスが使用されない低速検索になります。

これを回避するには、WHERE 句を次のように記述します。

SELECT [t0].[FirstName], [t0].[HireDate] FROM [dbo].[Employees] AS [t0]

WHERE [t0].[HireDate] >= '1994/01/01' AND [t0].[HireDate] < '1995/01/01'

このように記述すれば、ンデックスを使用できるようになります(ンデックスを作成している場合)。LINQ to SQL で

は、DataContext オブジェクトの ExecuteQuery メソッドを利用して、直接 SQL を実行することもできるので、次

のように、日付を指定することができます。

Dim Northwind As New NorthwindDataContext()

Northwind.Log = Console.Out

Dim emp As IEnumerable(Of Employees) = _

Northwind.ExecuteQuery(Of Employees) _

("SELECT * FROM Employees " _

& " WHERE HireDate >= {0} AND HireDate < {1}" _

, DateTime.Parse("1994/01/01"), DateTime.Parse("1995/01/01"))

DataGridView1.DataSource = emp.ToList

ExecuteQuery メソッドでは、String.Format と同じように {0} や {1} を利用して、文字列を置換することがで

きます。また、このように置換した場合は、次のように自動的にパラメータ化されたクエリが SQL Server に対して実

行されるようになります。

SELECT * FROM Employees WHERE HireDate >= @p0 AND HireDate < @p1

-- @p0: Input DateTime (Size = 0; Prec = 0; Scale = 0) [1994/01/01 0:00:00]

-- @p1: Input DateTime (Size = 0; Prec = 0; Scale = 0) [1995/01/01 0:00:00] -- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 3.5.30729.1

Page 63: SQL Server 2008 自習書シリーズ Nodownload.microsoft.com/.../SQL08_SelfLearning20_LINQ.pdf · sql server 2008 自習書 no.20 linq によるデータ ゕクセス入門 4 stteepp

SQL Server 2008 自習書 No.20 LINQ によるデータ ゕクセス入門

63

SSTTEEPP 77.. テテーーブブルルのの結結合合((JJOOIINN))

この STEP では、O/R デザナによってモデリングされたエンテゖテゖ間の関係

付け(Association)によって、親子関係にあるテーブルを簡単に JOIN(結合)で

きることを確認します。

この STEP では、次のことを学習します。

子エンテゖテゖの Association メンバを介した親エンテゖテゖの参照

DataGridView への取得結果のデータ バンド

Page 64: SQL Server 2008 自習書シリーズ Nodownload.microsoft.com/.../SQL08_SelfLearning20_LINQ.pdf · sql server 2008 自習書 no.20 linq によるデータ ゕクセス入門 4 stteepp

SQL Server 2008 自習書 No.20 LINQ によるデータ ゕクセス入門

64

7.1 作成するアプリケーション

作成するアプリケーション

この STEP では、Products(商品)テーブルの CategoryID(商品カテゴリ ID)をもとに、

Categories(商品カテゴリ)テーブルの CategoryName(カテゴリ名)を取得して、商品一覧

を表示するようにします。

このような親子関係のあるデータでも、LINQ を利用すると、SQL ステートメントを記述するこ

となく、データを取得することができます。LINQ では、O/R デザナ(.dbml フゔル)で自

動設定された Categories と Products エンテゖテゖ間の Association(関係付け)を使用し

て、テーブルを JOIN した結果を取得することができます。

商品カテゴリ名をCategories テーブルから取得

Page 65: SQL Server 2008 自習書シリーズ Nodownload.microsoft.com/.../SQL08_SelfLearning20_LINQ.pdf · sql server 2008 自習書 no.20 linq によるデータ ゕクセス入門 4 stteepp

SQL Server 2008 自習書 No.20 LINQ によるデータ ゕクセス入門

65

7.2 プロジェクトの作成とコントロールの配置

プロジェクトの作成とコントロールの配置

まずは、Windows フォーム用のプロジェクトを新しく作成して、フォーム上へ DataGridView コ

ントロールを配置します。

1. まずは、Visual Studio 2008 を起動して、[ファイル]メニューの[新規作成]から[プロ

ジェクト]をクリックします。

2. [新しいプロジェクト]ダゕログでは、[プロジェクトの種類」で[Visual Basic]を選択

し、[テンプレート]で[Windows フォーム アプリケーション]を選択します。

[プロジェクト名]は、[WinJoinQuery]へ変更(任意の名前を設定可能)して、[OK]ボ

タンをクリックします。

3. これにより、Form1.vb フゔルがデザン ビューで開かれます。

1

2

1 2

3

4

Page 66: SQL Server 2008 自習書シリーズ Nodownload.microsoft.com/.../SQL08_SelfLearning20_LINQ.pdf · sql server 2008 自習書 no.20 linq によるデータ ゕクセス入門 4 stteepp

SQL Server 2008 自習書 No.20 LINQ によるデータ ゕクセス入門

66

LINQ to SQL クラスの作成(.dbml ファイルの作成)

次に、LINQ to SQL クラスを作成します。

4. ソリューション エクスプローラでプロジェクトを右クリックして、[追加]の[新しい項目の

追加]をクリックします。

5. [新しい項目の追加]ダゕログが表示されたら、[テンプレート]から「LINQ to SQL ク

ラス」を選択します。

Form1.vb がデザン ビューで開かれる

2

1

Page 67: SQL Server 2008 自習書シリーズ Nodownload.microsoft.com/.../SQL08_SelfLearning20_LINQ.pdf · sql server 2008 自習書 no.20 linq によるデータ ゕクセス入門 4 stteepp

SQL Server 2008 自習書 No.20 LINQ によるデータ ゕクセス入門

67

フゔル名を「Northwind.dbml」へ変更して、[追加]ボタンをクリックします。

6. O/R デザイナが表示されたら、サーバー エクスプローラから「Categories」と「Products」

テーブルをドラッグ&ドロップして、エンテゖテゖを作成します。

7. 次に、Categories エンテゖテゖと Products エンテゖテゖが結ばれている「関連付け」

(Association)の線を右クリックして、[プロパティ]をクリックします。

1

2

3

1

2

O/R デザイナ

ドラッグ&ドロップ

Products エンテゖテゖ

Categories エンテゖテゖ

Page 68: SQL Server 2008 自習書シリーズ Nodownload.microsoft.com/.../SQL08_SelfLearning20_LINQ.pdf · sql server 2008 自習書 no.20 linq によるデータ ゕクセス入門 4 stteepp

SQL Server 2008 自習書 No.20 LINQ によるデータ ゕクセス入門

68

これにより、画面右下へ[プロパテゖ]ウンドウが表示されて、Categories エンテゖテゖ

と Products エンテゖテゖが「1 対多」(OneToMany)のリレーション シップが設定されて

いることを確認できます。

DataGridView コントロールの配置

次に、LINQ で取得した結果を表示するために、Windows フォーム上へ DataGridView コント

ロールを配置します。

8. まずは、次のように「Form1.vb」フゔルをダブル クリックして、フォーム デザナを開

きます。

1

Categories エンテゖテゖとProducts エンテゖテゖの間に1対多 のリレーション シップ

があることを示す

2

3

「Form1.vb」をダブル クリック

1

フォーム デザイナ

ツール ボックス

Page 69: SQL Server 2008 自習書シリーズ Nodownload.microsoft.com/.../SQL08_SelfLearning20_LINQ.pdf · sql server 2008 自習書 no.20 linq によるデータ ゕクセス入門 4 stteepp

SQL Server 2008 自習書 No.20 LINQ によるデータ ゕクセス入門

69

フォーム デザナを開いたら、[表示]メニューの[ツールボックス]をクリックして、ツー

ルボックスを表示します。

9. 続いて、ツールボックスの[データ]セクションから[DataGridView]コントロールをフ

ォーム(Form1.vb)上へドラッグ&ドロップします。

LINQ クエリの記述

次に、LINQ クエリで Products テーブルと Categories テーブルからデータを取得するための

コードを記述します。

10. まずは、次のようにフォーム(Form1.vb)上の任意の領域をダブル クリックして、Form の

Load ベント ハンドラ(Form1_Load)を生成します。

1

2

ドラッグ&ドロップ

フォーム上の任意の領域をダブル クリック

1

Form の Load ベント ハンドラが自動生成される

Page 70: SQL Server 2008 自習書シリーズ Nodownload.microsoft.com/.../SQL08_SelfLearning20_LINQ.pdf · sql server 2008 自習書 no.20 linq によるデータ ゕクセス入門 4 stteepp

SQL Server 2008 自習書 No.20 LINQ によるデータ ゕクセス入門

70

11. 次に、Form1_Load ベント ハンドラへ、次のように LINQ クエリを記述します。

Private Sub Form1_Load( … )

Dim Northwind As New NorthwindDataContext()

Northwind.Log = Console.Out

Dim prod = From p In Northwind.Products _

Order By p.Categories.CategoryName _

Select p.Categories.CategoryName, p.ProductID _

, p.ProductName, p.UnitPrice

DataGridView1.DataSource = prod

End Sub

このコードでは、From 句で「Products」エンテゖテゖを指定している点が、今までのコー

ドと違います。また、OrderBy 句と Select 句では、「p.Categories.CategoryName」と

記述しています。このように LINQ クエリでは、親テーブルを指定して、列データを取得す

ることができます。

また、ンテリセンスも効くので、簡単に親データを指定することができます。

12. コードの記述が完了したら、[デバッグ]メニューの[デバッグ開始]をクリックして、結果

を確認してみましょう。

ンテリセンスで親テーブルが表示される

1

Page 71: SQL Server 2008 自習書シリーズ Nodownload.microsoft.com/.../SQL08_SelfLearning20_LINQ.pdf · sql server 2008 自習書 no.20 linq によるデータ ゕクセス入門 4 stteepp

SQL Server 2008 自習書 No.20 LINQ によるデータ ゕクセス入門

71

CategoryName(カテゴリ名)を Categories テーブルから取得できていることを確認でき

ます。

このように LINQ クエリでは、親子関係のあるテーブル間のデータでも、簡単に取得するこ

とができます。

13. 結果を確認後、[出力]ウンドウを開いて、内部発行された SQL を参照します。

内部発行された SQL へ LEFT OUTER JOIN が追加されていることを確認できます。

SELECT [t1].[CategoryName], [t0].[ProductID], [t0].[ProductName], [t0].[UnitPrice]

FROM [dbo].[Products] AS [t0]

LEFT OUTER JOIN [dbo].[Categories] AS [t1] ON [t1].[CategoryID] = [t0].[CategoryID]

ORDER BY [t1].[CategoryName]

-- Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 3.5.30729.1

商品カテゴリ名をCategories テーブルから取得

1

2LEFT OUTER JOIN

が発行されている

Page 72: SQL Server 2008 自習書シリーズ Nodownload.microsoft.com/.../SQL08_SelfLearning20_LINQ.pdf · sql server 2008 自習書 no.20 linq によるデータ ゕクセス入門 4 stteepp

SQL Server 2008 自習書 No.20 LINQ によるデータ ゕクセス入門

72

SSTTEEPP 88.. AASSPP..NNEETT WWeebb フフォォーームムかかららのの

LLIINNQQ のの利利用用

この STEP では、LINQ DataSource コントロールを介した Web フォーム

(ASP.NET 3.5)から LINQ を利用する方法を説明します。

この STEP では、次のことを学習します。

ASP.NET Web フォームでの .dbml フゔル(LINQ to SQL クラス)の作成

LINQ DataSource コントロールと .dbml フゔルの関連付け

取得結果の GridView コントロールへのデータ バンド

DataContext が自動生成する SQL(ROW_NUMBER 関数)の確認

Page 73: SQL Server 2008 自習書シリーズ Nodownload.microsoft.com/.../SQL08_SelfLearning20_LINQ.pdf · sql server 2008 自習書 no.20 linq によるデータ ゕクセス入門 4 stteepp

SQL Server 2008 自習書 No.20 LINQ によるデータ ゕクセス入門

73

8.1 作成するアプリケーション

作成するアプリケーション

この STEP では、ASP.NET 3.5 の Web フォーム ゕプリケーションを作成し、Northwind デー

タベースの Products テーブルのデータを GridView コントロールへ表示する手順を説明しま

す。

データの表示には、LINQ DataSource コントロールを利用することで、ノン コーデゖングで結

果を表示することができます。また、ページング(10 件ずつのデータ表示)も、プログラムを記

述することなく実現することが可能です。

Productsテ ーブルのデータを 10件ずつ表示

ページング

↓2ページ目

Page 74: SQL Server 2008 自習書シリーズ Nodownload.microsoft.com/.../SQL08_SelfLearning20_LINQ.pdf · sql server 2008 自習書 no.20 linq によるデータ ゕクセス入門 4 stteepp

SQL Server 2008 自習書 No.20 LINQ によるデータ ゕクセス入門

74

8.2 プロジェクトの作成と LINQ to SQL クラスの作成

Web フォーム プロジェクトの新規作成

まずは、Web フォーム用のプロジェクトを新しく作成します。

1. Visual Studio 2008 を起動して、[ファイル]メニューの[新規作成]から[プロジェクト]

をクリックします。

2. [新しいプロジェクト]ダゕログでは、[プロジェクトの種類」で「Visual Basic」を選択

し、[テンプレート]で「ASP.NET Web アプリケーション」を選択します。

[プロジェクト名]は、任意の名前(WebApplication1)へ設定して、[OK]ボタンをクリ

ックします。

1

2

1

2

4

3

Page 75: SQL Server 2008 自習書シリーズ Nodownload.microsoft.com/.../SQL08_SelfLearning20_LINQ.pdf · sql server 2008 自習書 no.20 linq によるデータ ゕクセス入門 4 stteepp

SQL Server 2008 自習書 No.20 LINQ によるデータ ゕクセス入門

75

LINQ to SQL クラスの作成(.dbml ファイルの作成)

次に、LINQ to SQL クラスを作成します。

3. [プロジェクト]メニューの[新しい項目の追加]をクリックします。

[新しい項目の追加]ダゕログでは、[テンプレート]から「LINQ to SQL クラス」を選

択します。フゔル名は、「Northwind.dbml」へ変更して、[追加]ボタンをクリックしま

す。

4. O/R デザイナ が表示されたら、サーバー エクスプローラから「Products」テーブルをド

ラッグ&ドロップして、エンテゖテゖを作成します。

1

2

3

4

1

O/R デザイナ

ドラッグ&ドロップProducts エンテゖテゖ

Page 76: SQL Server 2008 自習書シリーズ Nodownload.microsoft.com/.../SQL08_SelfLearning20_LINQ.pdf · sql server 2008 自習書 no.20 linq によるデータ ゕクセス入門 4 stteepp

SQL Server 2008 自習書 No.20 LINQ によるデータ ゕクセス入門

76

5. エンテゖテゖの作成後、[ビルド]メニューの[WebApplication1 のビルド]をクリックし

て、ビルドします(後述の LINQ DataSource コントロールを利用するには、ビルドが必要

です)。

Web フォームへの GridView コントロールの配置

1. 次に、ソリューション エクスプローラで、「Default.aspx」をダブル クリックし、[デザ

ン]タブを開きます(フォーム デザナを開きます)。

フォーム デザナを開いたら、次にツールボックスを開きます。

1

Default.aspx フゔルをダブル クリックする

1

デザインをクリックする

2ツールボックスをクリックする

3

フォーム デザイナ

Page 77: SQL Server 2008 自習書シリーズ Nodownload.microsoft.com/.../SQL08_SelfLearning20_LINQ.pdf · sql server 2008 自習書 no.20 linq によるデータ ゕクセス入門 4 stteepp

SQL Server 2008 自習書 No.20 LINQ によるデータ ゕクセス入門

77

2. ツールボックスの[データ]セクションから「GridView」コントロールを Web フォーム上

へドラッグ&ドロップします。

LINQ DataSource コントロールの利用

3. 配置した GridView コントロールの右上のタスク メニューを開き、[データ ソースの選択]

から[<新しいデータ ソース>]をクリックします。

4. これにより、[データ ソース構成ウゖザード]が起動するので、「LINQ」を選択して、[OK]

ボタンをクリックします。

1

1

2

3

2

1

Page 78: SQL Server 2008 自習書シリーズ Nodownload.microsoft.com/.../SQL08_SelfLearning20_LINQ.pdf · sql server 2008 自習書 no.20 linq によるデータ ゕクセス入門 4 stteepp

SQL Server 2008 自習書 No.20 LINQ によるデータ ゕクセス入門

78

5. 次の[コンテキスト オブジェクトの選択]画面では、「WebApplication1.NorthwindData

Context」を選択し[次へ]ボタンをクリックします。

この画面で、NorthwindDataContext が表示されない場合は、[ビルド]メニューからプロ

ジェクトをビルドしてから、もう一度ウゖザードを実行してください。

6. 次の[データの選択の構成]画面では、[テーブル]で、「Products(Table<Products>)」

を選択します。

[Select]では、「ProductID」と「ProductName」、「CategoryID」、「UnitPrice」の 4

つをチェックして、[完了]ボタンをクリックします。

これで、Products テーブルの選択した列を GridView へ表示できるようになります。

7. ウゖザードが完了すると、次のようにフォーム デザナ上へ「LinqDataSource」コントロ

ールが配置されて、GridView コントロールと関連付けられます。

1

2

1

2

3

Page 79: SQL Server 2008 自習書シリーズ Nodownload.microsoft.com/.../SQL08_SelfLearning20_LINQ.pdf · sql server 2008 自習書 no.20 linq によるデータ ゕクセス入門 4 stteepp

SQL Server 2008 自習書 No.20 LINQ によるデータ ゕクセス入門

79

次に、[GridView]コントロールのタスク メニューを開いて、[ページングを有効にする]を

をチェックします。これで、10 件ずつのページングを有効にすることができます。

Web フォームの実行と生成される SQL の確認

8. 次に、[デバッグ]メニューの[デバッグ開始]をクリックして、Web フォームを実行しま

す。

[デバッグが無効です]ダゕログが表示されたら、[デバッグを有効にするために

Web.config ファイルを有効にする]をチェックして、[OK]ボタンをクリックします。

9. これにより、次のように Web ブラウザが起動されて、Products テーブルのデータが

GridView コントロールへ表示されることを確認できます。

LinqDataSourceコントロールが生成される

3

1

2

2

3

1

Page 80: SQL Server 2008 自習書シリーズ Nodownload.microsoft.com/.../SQL08_SelfLearning20_LINQ.pdf · sql server 2008 自習書 no.20 linq によるデータ ゕクセス入門 4 stteepp

SQL Server 2008 自習書 No.20 LINQ によるデータ ゕクセス入門

80

「ページング」を有効にしたので、データが 10 件ずつ表示され、ページ番号をクリックする

と、次の 10 件が表示されるようになります。

10. 結果を確認後、Internet Explorer を終了して、デバッグを終了します。

内部実行される SQL の確認(プロファイラ)

次に、内部実行される SQL を、プロファイラ(SQL Server Profiler)を利用して確認してみまし

ょう。

1. プロフゔラを起動するには、[スタート]メニューの[すべてのプログラム]→[Microsoft

SQL Server 2008]→[パフォーマンス ツール]から[SQL Server Profiler]をクリッ

クします。

2. プロフゔラが起動したら、[ファイル]メニューの[新しいトレース]をクリックして、新

しいトレースを開始します。

Productsテ ーブルのデータが 10件表示される

ページング

2ページ目

Page 81: SQL Server 2008 自習書シリーズ Nodownload.microsoft.com/.../SQL08_SelfLearning20_LINQ.pdf · sql server 2008 自習書 no.20 linq によるデータ ゕクセス入門 4 stteepp

SQL Server 2008 自習書 No.20 LINQ によるデータ ゕクセス入門

81

[サーバーへの接続]ダゕログでは、[サーバー名]へ接続先の SQL Server の名前を入力

して、[接続]ボタンをクリックします。

3. [トレース プロパテゖ]ダゕログが表示されたら、[実行]ボタンをクリックします。

これで SQL Server に対して実行された SQL をキャプチャできるようになります。

4. Visual Studio 2008 へ戻り、[デバッグ]メニューの[デバッグ開始]をクリックして、Web

フォームを実行します。

2

3

1

1

1

Page 82: SQL Server 2008 自習書シリーズ Nodownload.microsoft.com/.../SQL08_SelfLearning20_LINQ.pdf · sql server 2008 自習書 no.20 linq によるデータ ゕクセス入門 4 stteepp

SQL Server 2008 自習書 No.20 LINQ によるデータ ゕクセス入門

82

Web フォームが開いて、最初のページが表示されたら、2 ページ目へ移動します。

5. この後、プロフゔラへ戻ると、最初のページと 2 ページ目へ移動したときに、内部実行さ

れた SQL を確認することができます。

SQL が記録されていることを確認したら、ツールバーの[停止]ボタンをクリックして、ト

レースを停止します。

最初のページで内部実行される SQL: TOP(10)

最初のページで内部実行される SQL は、次のとおりです。

SELECT COUNT(*) AS [value]

FROM [dbo].[Products] AS [t0]

SELECT TOP (10)

[t0].[ProductID], [t0].[ProductName], [t0].[CategoryID], [t0].[UnitPrice]

FROM [dbo].[Products] AS [t0]

最初に COUNT 関数で、結果の件数を取得し、次に TOP 関数を利用して最初の 10 件のみ

を取得しています。

2 ページ目以降で内部実行される SQL: ROW_NUMBER

2 ページ目へ移動したときに内部実行される SQL は、次のとおりです。

1

内部実行されたSQL

Page 83: SQL Server 2008 自習書シリーズ Nodownload.microsoft.com/.../SQL08_SelfLearning20_LINQ.pdf · sql server 2008 自習書 no.20 linq によるデータ ゕクセス入門 4 stteepp

SQL Server 2008 自習書 No.20 LINQ によるデータ ゕクセス入門

83

SELECT COUNT(*) AS [value]

FROM [dbo].[Products] AS [t0]

exec sp_executesql N'

SELECT [t1].[ProductID], [t1].[ProductName], [t1].[CategoryID], [t1].[UnitPrice]

FROM (

SELECT ROW_NUMBER() OVER (ORDER BY [t0].[ProductID], [t0].[ProductName]

, [t0].[CategoryID], [t0].[UnitPrice]) AS [ROW_NUMBER]

, [t0].[ProductID], [t0].[ProductName], [t0].[CategoryID], [t0].[UnitPrice]

FROM [dbo].[Products] AS [t0]

) AS [t1]

WHERE [t1].[ROW_NUMBER] BETWEEN @p0 + 1 AND @p0 + @p1

ORDER BY [t1].[ROW_NUMBER]

',N'@p0 int,@p1 int', @p0=10, @p1=10

ROW_NUMBER 関数によって、結果の行番号を取得して、それを BETWEEN 演算子で該

当ページ番号のデータのみを取得しています。

このように LINQ では、ページングのクエリも自動実行されるように作られています。しか

し、ROW_NUMBER 関数の ORDER BY 句ですべての列が指定されていたり、ページ移動の

たびに COUNT 関数が実行されているなど、パフォーマンスが良いクエリというわけではあ

りません。もちろん、以前の ASP.NET 2.x までのページング(毎回 DataSet を丸ごと作す

るページング)に比べれば、効率の良いクエリになりますが、これが最高のパフォーマンスで

実行されるというわけではありません。特に、このパフォーマンスは、データ件数が増えた場

合に大きな差となって現れます。したがって、パフォーマンスが求められる環境(大量データ

のページングを行う場合)には、LINQ が自動生成する SQL に頼らずに、(以前のバージョ

ンと同様)SQL をチューニングしていくことが重要です。

Note: LINQ DataSource コントロールを利用せずに GridView へバインドする方法

LINQ DataSource コントロールを利用しなくても、GridView へのデータ バンドは簡単に行えます。たとえば、

次のようにコードを記述できます。

Dim Northwind As New NorthwindDataContext()

Dim prod = From p In Northwind.Products _

Select p.ProductID, p.ProductName, p.CategoryID, p.UnitPrice

GridView1.DataSource = prod.Skip(10).Take(5) GridView1.DataBind()

コードは、今までの Step で記述したものとほとんど同じです。最後の「Skip」メソッドを利用しているところ

が初めての記述ですが、このメソッドで、指定した件数のデータをスキップ(飛ばす)して、Take で指定した分

10件 Skip して11件目から 5件分

Page 84: SQL Server 2008 自習書シリーズ Nodownload.microsoft.com/.../SQL08_SelfLearning20_LINQ.pdf · sql server 2008 自習書 no.20 linq によるデータ ゕクセス入門 4 stteepp

SQL Server 2008 自習書 No.20 LINQ によるデータ ゕクセス入門

84

のデータ件数(ここでは 5 件を指定)のみを取得できるようになります。したがって、これを GridView コント

ロールのカスタム ページングと組み合わせて利用すれば、LinqDataSource コントロールによる自動ページング

のように、(非効率な)毎回の Count 関数の実行を防ぐことがきます。

Skip メソッドによって、内部実行される SQL は、前述の自動ページングの場合と同様、次のとおりです。

exec sp_executesql N' SELECT [t1].[ProductID], [t1].[ProductName], [t1].[CategoryID], [t1].[UnitPrice]

FROM (

SELECT ROW_NUMBER() OVER (ORDER BY [t0].[ProductID], [t0].[ProductName]

, [t0].[CategoryID], [t0].[UnitPrice]) AS [ROW_NUMBER]

, [t0].[ProductID], [t0].[ProductName], [t0].[CategoryID], [t0].[UnitPrice]

FROM [dbo].[Products] AS [t0]

) AS [t1]

WHERE [t1].[ROW_NUMBER] BETWEEN @p0 + 1 AND @p0 + @p1 ORDER BY [t1].[ROW_NUMBER] ',N'@p0 int,@p1 int', @p0=10, @p1=5

Skip で指定した値が @p0 へ代入され、Take で指定した値が @p1 へ代入されます。

Page 85: SQL Server 2008 自習書シリーズ Nodownload.microsoft.com/.../SQL08_SelfLearning20_LINQ.pdf · sql server 2008 自習書 no.20 linq によるデータ ゕクセス入門 4 stteepp

SQL Server 2008 自習書 No.20 LINQ によるデータ ゕクセス入門

85

SSTTEEPP 99.. LLIINNQQ ttoo SSQQLL にによよるるデデーータタ更更新新

この STEP では、LINQ to SQL によるデータの更新方法を説明します。また、更

新の競合が発生した場合の動作についても説明します。

この STEP では、次のことを学習します。

DataContext オブジェクトの SubmitChanges メソッドの呼び出し

更新の競合の検出(オプテゖミステゖック同時実行制御)

Page 86: SQL Server 2008 自習書シリーズ Nodownload.microsoft.com/.../SQL08_SelfLearning20_LINQ.pdf · sql server 2008 自習書 no.20 linq によるデータ ゕクセス入門 4 stteepp

SQL Server 2008 自習書 No.20 LINQ によるデータ ゕクセス入門

86

9.1 作成するアプリケーション

この STEP では、Binding Navigator コントロールを利用して、Categories テーブルのデータ

を 1 件ずつ表示するゕプリケーションを作成します。

また、複数のユーザーによって、同時更新された場合の動作についても確認します。

LINQ では、データの更新が行える SubmitChanges メソッドが用意され、このメソッドは、同

時更新を検出できるように実装されている(自動的にオプティミスティック同時実行制御を行って

くれる)ので、これを確認していきましょう。

BindingNavigator コントロールでデータの移動を可能に

Y へ変更 Z へ変更

更新競合のエラーが発生!

複数のユーザーが、同時に同じデータを更新した場合

Page 87: SQL Server 2008 自習書シリーズ Nodownload.microsoft.com/.../SQL08_SelfLearning20_LINQ.pdf · sql server 2008 自習書 no.20 linq によるデータ ゕクセス入門 4 stteepp

SQL Server 2008 自習書 No.20 LINQ によるデータ ゕクセス入門

87

9.2 LINQ to SQL によるデータ更新

プロジェクトの新規作成とコントロールの配置

まずは、Windows フォーム用のプロジェクトを新しく作成します。

1. Visual Studio 2008 を起動して、[ファイル]メニューの[新規作成]から[プロジェクト]

をクリックします。

2. [新しいプロジェクト]ダゕログでは、[プロジェクトの種類」で「Visual Basic」を選択

し、[テンプレート]で「Windows フォーム アプリケーション」を選択します。

[プロジェクト名]は、「WinSubmitChange」へ変更(任意の名前を設定可能)して、[OK]

ボタンをクリックします。

3. これにより、Form1.vb フゔルがデザン ビューで開かれます。

1

2

1

2

3

4

Page 88: SQL Server 2008 自習書シリーズ Nodownload.microsoft.com/.../SQL08_SelfLearning20_LINQ.pdf · sql server 2008 自習書 no.20 linq によるデータ ゕクセス入門 4 stteepp

SQL Server 2008 自習書 No.20 LINQ によるデータ ゕクセス入門

88

LINQ to SQL クラスの作成(.dbml ファイルの作成)

次に、LINQ to SQL クラスを作成します。

4. [プロジェクト]メニューの[新しい項目の追加]をクリックします。

[新しい項目の追加]ダゕログでは、[テンプレート]から「LINQ to SQL クラス」を選

択します。フゔル名は、「Northwind.dbml」へ変更して、[追加]ボタンをクリックしま

す。

5. O/R デザイナが表示されたら、サーバー エクスプローラから「Categories」テーブルをド

Form1.vb がデザン ビューで開かれる

1

2

3

4

Page 89: SQL Server 2008 自習書シリーズ Nodownload.microsoft.com/.../SQL08_SelfLearning20_LINQ.pdf · sql server 2008 自習書 no.20 linq によるデータ ゕクセス入門 4 stteepp

SQL Server 2008 自習書 No.20 LINQ によるデータ ゕクセス入門

89

ラッグ&ドロップして、エンテゖテゖを作成します。

6. エンテゖテゖの作成後、ツールバーの[保存]ボタンをクリックして、「Northwind.dbml」

フゔルを保存します。

オブジェクト データソースの作成(BindingNavigator を利用するため)

次に、BindingNavigator コントロールを利用するために、オブジェクト データソースを作成し

ます。

7. オブジェクト データソースを作成するには、[データ]メニューの[データソースの表示]を

クリックします。

1

O/R デザイナ

ドラッグ&ドロップ

Categories エンテゖテゖ

1

Page 90: SQL Server 2008 自習書シリーズ Nodownload.microsoft.com/.../SQL08_SelfLearning20_LINQ.pdf · sql server 2008 自習書 no.20 linq によるデータ ゕクセス入門 4 stteepp

SQL Server 2008 自習書 No.20 LINQ によるデータ ゕクセス入門

90

これにより、画面左側へ[データソース]ウゖンドウが表示されます。このウンドウでは、

[新しいデータソースの追加]をクリックします。これにより、[データ ソース構成ウゖザー

ド]が起動されます。

8. 最初の[データソースの種類を選択]画面では、[オブジェクト]を選択して、[次へ]ボタン

をクリックします。

9. 次の[バンド先のオブジェクトを選択します]画面では、[WinSubmitChange]を展開し

て、[Categories]クラスを選択し、[次へ]ボタンをクリックします。

1

2

「データソース」ウインドウが表示

される

1

2

Page 91: SQL Server 2008 自習書シリーズ Nodownload.microsoft.com/.../SQL08_SelfLearning20_LINQ.pdf · sql server 2008 自習書 no.20 linq によるデータ ゕクセス入門 4 stteepp

SQL Server 2008 自習書 No.20 LINQ によるデータ ゕクセス入門

91

Categories が表示されない場合は、「Northwind.dbml」フゔルを保存してから、もう一

度ウゖザードを実行してください。

10. 次の画面では、[完了]ボタンをクリックして、ウゖザードを完了します。

11. ウゖザード完了後、ソリューション エクスプローラで「Form1.vb」フゔルをダブル クリ

ックして、フォーム デザナを開きます。

1

2

1

Page 92: SQL Server 2008 自習書シリーズ Nodownload.microsoft.com/.../SQL08_SelfLearning20_LINQ.pdf · sql server 2008 自習書 no.20 linq によるデータ ゕクセス入門 4 stteepp

SQL Server 2008 自習書 No.20 LINQ によるデータ ゕクセス入門

92

12. 次に、[データ ソース]ウゖンドウを表示して、「Categories」の右隣に表示されるドロップ

ダウン ボタンをクリックして、[詳細]をクリックします。

13. 続いて、「CategoryID」をフォーム上へドラッグ&ドロップします。

これにより、「BindingNavigator」コントロールと、CategoryID 列とデータ バンドさ

「Form1.vb」をダブル クリック

1

フォーム デザイナ

2

1

1

BindingNavigator と Label、TextBoxコントロールが自動生成される

BindingNavigator と BindingSourceオブジェクトが自動生成される

Page 93: SQL Server 2008 自習書シリーズ Nodownload.microsoft.com/.../SQL08_SelfLearning20_LINQ.pdf · sql server 2008 自習書 no.20 linq によるデータ ゕクセス入門 4 stteepp

SQL Server 2008 自習書 No.20 LINQ によるデータ ゕクセス入門

93

れた「TextBox」コントロールが配置されます。また、フォーム デザナ下部のトレには、

「BindingNavigator」と「BindingSource」オブジェクトが自動生成されています。

14. 次に、[データ ソース]ウゖンドウから「CategoryName」を選択し、フォーム上へドラッ

グ&ドロップします。

これにより、CategoryName 列とデータ バンドされた「TextBox」コントロールが配置

されます。

BindingSource と LINQ のデータバインド

15. 次に、フォーム(Form1.vb)上の任意の領域をダブル クリックして、Form1_Load ベ

ント ハンドラを生成します。

16. コード エデゖタでは、Form1_Load ベント ハンドラの上へ、DataContext クラスを

ンスタンス化するためのコードを 1 行記述します。

Private Northwind As New NorthwindDataContext()

Private Sub Form1_Load( … )

1

フォーム上の任意の領域をダブル クリック

1

Form の Load ベント ハンドラが自動生成される

Page 94: SQL Server 2008 自習書シリーズ Nodownload.microsoft.com/.../SQL08_SelfLearning20_LINQ.pdf · sql server 2008 自習書 no.20 linq によるデータ ゕクセス入門 4 stteepp

SQL Server 2008 自習書 No.20 LINQ によるデータ ゕクセス入門

94

17. 次に、Form1_Load ベント ハンドラの中へ、 BindingSource オブジェクトと LINQ

の DataContext オブジェクトをデータ バンドするためのコードを 1 行記述します。

Private Northwind As New NorthwindDataContext()

Private Sub Form1_Load( … )

CategoriesBindingSource.DataSource = Northwind.Categories

End Sub

これで、LINQ で取得した Categories テーブルのデータを BindingNavigator や TextBox

コントロールとデータ バンドできるようになります。

18. コードの記述が完了したら、[デバッグ]メニューの[デバッグ開始]をクリックして、結果

を確認してみましょう。

CategoryID と CategoryName のデータがテキスト ボックスへ表示されて、[次に移動]

1

Page 95: SQL Server 2008 自習書シリーズ Nodownload.microsoft.com/.../SQL08_SelfLearning20_LINQ.pdf · sql server 2008 自習書 no.20 linq によるデータ ゕクセス入門 4 stteepp

SQL Server 2008 自習書 No.20 LINQ によるデータ ゕクセス入門

95

ボタンをクリックすると、次のデータが表示されることを確認できます。

19. 確認後、Windows フォームを終了して、デバッグを終了します。

DataContext オブジェクトによる更新処理の実装

次に、テキスト ボックスのデータが変更された場合に、データを更新できるようにしてみましょ

う。

1. まずは、更新ボタンを追加するために、「BindingNavigator」コントロールの右端の

[ToolStripButton の追加]をプルダウンし、メニューから「Button」をクリックします。

2. 配置した「ToolStripButton」コントロールを選択して、[プロパテゖ]ウゖンドウを開き、

[DisplayStyle]プロパテゖを「Text」へ変更してます。

次に、[Text]プロパテゖを「Update」へ変更します。

3. 変更後、[プロパテゖ]ウゖンドウで[イベント]ボタンをクリックして、「Click」ベント

をダブル クリックします。

ToolStripButton の追加1

1

2 3

4

5

1

2

Page 96: SQL Server 2008 自習書シリーズ Nodownload.microsoft.com/.../SQL08_SelfLearning20_LINQ.pdf · sql server 2008 自習書 no.20 linq によるデータ ゕクセス入門 4 stteepp

SQL Server 2008 自習書 No.20 LINQ によるデータ ゕクセス入門

96

4. これにより、コード エデゖタへ ToolStripButton1 の Click ベント ハンドラが生成され

ます。

5. 生成されたベント ハンドラへ、以下のコードを記述します。

Private Sub ToolStripButton1_Click( …)

CategoriesBindingSource.EndEdit()

Northwind.SubmitChanges()

End Sub

DataContext オブジェクトの SubmitChanges は、データ更新を実行するためのメソッド

です。

6. 次に、データ更新時に内部実行された SQL を確認するために、Form1_Load ベント ハ

ンドラへ次の 1 行(Log プロパテゖの設定)を追加します。

Northwind.Log = Console.Out

オプティミスティック同時実行制御による更新競合の検出

7. コードの記述が完了したら、[ビルド]メニューの[WinSubmitChange のビルド]をクリ

ックして、ビルドします。

Page 97: SQL Server 2008 自習書シリーズ Nodownload.microsoft.com/.../SQL08_SelfLearning20_LINQ.pdf · sql server 2008 自習書 no.20 linq によるデータ ゕクセス入門 4 stteepp

SQL Server 2008 自習書 No.20 LINQ によるデータ ゕクセス入門

97

8. ビルドが完了したら、Windows エクスプローラを起動して、ビルドした EXE フゔル

「WinSubmitChange.exe」が格納されているフォルダを開きます(既定では、マ ドキ

ュメントの下の「Visual Studio 2008\Projects\WinSubmitChanges\bin\Debug」

フォルダです)。

このフォルダの「WinSubmitChange.exe」フゔルをダブル クリックして、Windows フ

ォームを起動します。起動後、もう一度「WinSubmitChange.exe」フゔルをダブル ク

リックして、もう 1 つ Windows フォームを起動します。

9. 次に、最初に起動した Windows フォームの「Category Name」の値を[BeveragesY]

へ変更して、[Update]ボタンをクリックし、2 つ目の起動した Windows フォーム側を

「BeveragesZ」へ変更して、[Update]ボタンをクリックします。

1

「出力」ウンドウでビルドが正常終了したか

どうかを確認可能

1

2

Y へ変更

2

1Z へ変更

4

3

Page 98: SQL Server 2008 自習書シリーズ Nodownload.microsoft.com/.../SQL08_SelfLearning20_LINQ.pdf · sql server 2008 自習書 no.20 linq によるデータ ゕクセス入門 4 stteepp

SQL Server 2008 自習書 No.20 LINQ によるデータ ゕクセス入門

98

すると、次のエラーが通達されます。

「行が見つからないか変更されています」とメッセージが表示されていることを確認できます。

このように、LINQ によるデータ更新(SubmitChanges メソッド)では、自動的に同時更新

を検出して、後から更新した側をエラーになるようにしてくれています。つまり、オプテゖミ

ステゖック(楽観的)同時実行制御が自動実装されています。

内部実行された SQL の確認

次に、内部実行された SQL を確認するために、Visual Studio 2008 からデバッグ実行します。

10. Visual Studio 2008 で[デバッグ]メニューの[デバッグ開始]をクリックして、Windows

フォームを実行します。

Category Name が「BeveragesY」と表示されて、前の手順で最初に実行した Windows フ

ォームで更新した値が反映されていることを確認できます。

11. 次に、Category Name が「BeveragesW」と変更して、「Update」ボタンをクリックしま

1

現在の値はY

1

Page 99: SQL Server 2008 自習書シリーズ Nodownload.microsoft.com/.../SQL08_SelfLearning20_LINQ.pdf · sql server 2008 自習書 no.20 linq によるデータ ゕクセス入門 4 stteepp

SQL Server 2008 自習書 No.20 LINQ によるデータ ゕクセス入門

99

す。

12. [出力]ウンドウを開いて、内部実行された SQL を確認します。

UPDATE [dbo].[Categories]

SET [CategoryName] = @p2

WHERE ([CategoryID] = @p0) AND ([CategoryName] = @p1)

-- @p0: Input Int (Size = 0; Prec = 0; Scale = 0) [1]

-- @p1: Input NVarChar (Size = 10; Prec = 0; Scale = 0) [BeveragesY]

-- @p2: Input NVarChar (Size = 10; Prec = 0; Scale = 0) [BeveragesW]

パラメータ部分を当てはめると、次のようになります。

UPDATE [dbo].[Categories]

SET [CategoryName] = BeveragesW

WHERE ([CategoryID] = 1) AND ([CategoryName] = BeveragesY)

UPDATE ステートメントの WHERE 句には、データを取得したときの値(BeveragesY)

が指定されていることを確認できます。

このように、データを取得したときの値が自動的にセットされることで、他のユーザーからの

同時更新を防げるようになります。

Tips: WHERE 句へすべての列を含めない方法: timestamp 列

SubmitChanges メソッドのデフォルトは、データを読み取ったときのデータをすべて WHERE 句へ入れる形に

なりますが、読み取ったデータに大きい値(商品の説明データなど)が格納されている場合には注意が必要です。

この取得した大きい値を更新しない場合にも、他のデータの更新時に、そのデータが WHERE 句へセットされて

ネットワーク上へ流れてしまうからです。

これを回避するには、timestamp データ型の列をテーブルへ追加します。この列を追加しておくと、

SubmitChanges メソッドの動作が変更されて、WHERE 句には、主キー列と timestamp 列のみが設定された

軽いクエリへ変わり、パフォーマンスが良くなります。

W へ変更

2

1

1

Page 100: SQL Server 2008 自習書シリーズ Nodownload.microsoft.com/.../SQL08_SelfLearning20_LINQ.pdf · sql server 2008 自習書 no.20 linq によるデータ ゕクセス入門 4 stteepp

SQL Server 2008 自習書 No.20 LINQ によるデータ ゕクセス入門

100

おわりに

最後までこの自習書の内容を試された皆さま、いかがでしたでしょうか? Visual Studio 2008 の

O/R デザナによって自動生成される DataContext クラスと、LINQ to SQL を組み合わせるこ

とによって、SQL Server 2008 の データベース構造や SQL ステートメントを記述しなくても、

データ ゕクセス処理を実装できることを確認できたのではないでしょうか。

しかし、LINQ to SQL では、内部実行される SQL ステートメントに注意しないと、パフォーマ

ンスの悪いゕプリケーションを作ってしまうことになるので、SQL ステートメントの知識もしっ

かりと身に付けておくことが重要です。また、LINQ to SQL では、DML 系のステートメント

(UPDATE/INSERT/DELETE)を直接実行するには ExecuteCommand メソッドを利用し

なければならなかったり、LINQ クエリ内でロックヒント(UPDLOCK など)を指定できないと

いう制限もあるので、更新系の処理は、(現在のバージョンの)LINQ to SQL が苦手なところです。

ま た 、 TransactionScope オ ブ ジ ェ ク ト を 利 用 し た ト ラ ン ザ ク シ ョ ン 処 理 の 中 で

SubmitChanges メソッドを利用する場合は、デフォルトの分離レベルが Serizalizable である

ことから、変換デッドロックの発生に注意しなければなりません。

今回は、「入門編」ということで、基本的な参照方法のみの紹介になりましたが、LINQ には、オ

ブジェクトをクエリするため「LINQ to Object」や、DataSet をクエリするための「LINQ to

DataSet」、ADO.NET Entity Model をクエリするための「LINQ to Entities」などもあります。

いずれも同じ構文(From 句、Where 句、Select 句)が利用できるので、LINQ to SQL で得た

知識は、いろいろな場面で役立ちます。この自習書をきっかけに、MSDN ラブラリなどを利用

して、さらに応用的な利用方法にチャレンジしていただければと思います。

SQL ステートメントに関しては、次の自習書で詳しく説明しているので、こちらもぜひご覧にな

ってみてください。

SQL 基礎の基礎

SQL 標準規格に準じた SQL ステートメントについて、SELECT ステートメントの応用的な

利用方法を中心に、実際に役立つ SQL ステートメントの利用方法を、基礎の基礎から学ぶこ

とができる、入門者向けの自習書です。

Transact-SQL 入門

SQL Server を操作するための独自の言語「Transact-SQL」について、詳しく学ぶことがで

きる自習書です。データ型や照合順序、関数、変数など、SQL Server を利用したゕプリケー

ションを開発する上では必須となる機能を説明しています。

開発者のための Transact-SQL 応用

Transact-SQL の応用編です。動的 SQL や、ストゕド プロシージャ、トランザクション、

エラー処理といった、応用的な Transact-SQL の利用方法を学ぶことができます。

Page 101: SQL Server 2008 自習書シリーズ Nodownload.microsoft.com/.../SQL08_SelfLearning20_LINQ.pdf · sql server 2008 自習書 no.20 linq によるデータ ゕクセス入門 4 stteepp

SQL Server 2008 自習書 No.20 LINQ によるデータ ゕクセス入門

101

執筆者プロフィール

有限会社エスキューエル・クオリティ(http://www.sqlquality.com/)

SQL Server と .NET を中心とした「コンサルテゖング サービス」と「メンタリング サービス」を提供。

主なコンサルテゖング実績

9 TB データベースの物理・論理設計支援 (パーテゖショニング対応など)

1 秒あたり 1,000 Batch Request の ASP(ゕプリケーション サービス プロバダ)サトの

チューニング(ピーク時の CPU 利用率 100% を 10% まで軽減)

高負荷テスト(ラッシュテスト)実施のためのテスト ゕプリの作成支援

大手流通系システムの夜間バッチ実行時間を 4 時間から 1 時間半へ短縮

大手ンターネット通販システムの夜間バッチ実行時間を 5 時間から 1 時間半へ短縮

宅配便トラッキング情報の日中バッチ実行時間を 2 時間から 5 分へ短縮

検索系 Web サトのチューニング(10 倍以上のパフォーマンス UP を実現)

10 Server によるレプリケーション環境のチューニング

3 TB のセキュリテゖ監査ゕプリケーションのチューニング

大手家電メーカーの制御系ゕプリケーション(100GB)のチューニングと運用管理設計

約 3,000 本のストゕド プロシージャとユーザー定義関数のチューニング

ASP.NET / ASP(Active Server Pages)ゕプリケーションのチューニング

大手ゕミューズメント企業の BI システム設計支援

外資系医療メーカーの Analysis Services による「販売分析」システムの設計支援

大手企業の Analysis Services による「財務諸表分析」システムの設計支援

Analysis Services OLAP キューブのパフォーマンス チューニング etc

松本美穂(まつもと・みほ)

有限会社エスキューエル・クオリテゖ 代表取締役

Microsoft MVP for SQL Server / PASSJ 理事

MCDBA(Microsoft Certified Database Administrator)

MCSD for .NET(Microsoft Certified Solution Developer)

現在、SQL Server を中心とするコンサルテゖング、企業に対するメンタリング サービスなどを行っている。今までに手

がけたコンサルテゖング案件は、テラバト クラスの DB から少人数向け小規模 DB までと 幅広く多岐に渡る。得意分

野はパフォーマンス チューニング。コンサルテゖング業務の傍ら、講演や執筆も行い、Microsoft 主催の最大ベント

Tech・Ed や、PASSJ が主催するカンフゔレンスなどでスピーカーとしても活躍中。著書の『SQL Server 2000 でいっ

てみよう』と『ASP.NET でいってみよう』(いずれも翔泳社刊)はトップ セラー(前者は 28,500 部、後者は 15,500 部

発行)。のびのびになっている SQL Server の新書籍は、もうじき刊行予定。

松本崇博(まつもと・たかひろ)

有限会社エスキューエル・クオリテゖ 取締役

Microsoft MVP for SQL Server / PASSJ 理事

MCDBA(Microsoft Certified Database Administrator)

MCSD for .NET(Microsoft Certified Solution Developer)

SQL Server のパフォーマンス チューニングを得意とするコンサルタント。過去には、約 3,000 本のストゕド プロシー

ジャのチューニングや、テラバト級データベースの論理・物理設計、運用管理設計、高可用性設計などを行う。また、過

去には、実際のゕプリケーション開発経験(ASP/ASP.NET、VB 6.0、Java、Access VBA など)と、システム管理者(IT

Pro)経験もあり、SQL Server だけでなく、ゕプリケーションや OS、Web サーバーを絡めた 総合的なコンサルテゖン

グが行えるのが強み。最近は、Analysis Services と Excel 2007 による BI(ビジネス ンテリジェンス)システムも

得意とする。執筆時のペンネームは「百田昌馬」。月刊 Windows Developer マガジンの 『SQL Server でど~んといっ

てみよう!』、DB マガジンの『SQL Server トラの穴』を連載。マクロソフト公開のホワトペーパー(技術文書)の

ゴースト ラターとして活動することもあり。過去、マクロソフト認定トレーナー時代には、SMS(Systems

Management Server)や、Proxy Server、Commerce Server、BizTalk Server、Application Center、Outlook CDO な

どの講習会も担当。1998 年度には、Microsoft CTEC(現 CPLS)トレーナー ゕワード(Trainer of the Year)を受賞。