過去数カ月間ブログには、今度リリースされるVisual Studioおよび .NET Framework "Orcas"に付随する新しい言語の特徴について書いてきました。以下がそのシリーズのポイントとなります。:
上記の言語の特徴によりデータ検索 を第一級のプログラミング概念としました。私たちはこのデータ検索プログラミングモデルの全体を"LINQ"と呼んでいます。 - これは.NET Language Integrated Queryの略です。
開発者はどのデータソースでもLINQを使うことができます。. 選択したプログラミング言語で効果的なクエリの言動を表現することができ、またオプションとしてデータクエリを変形・形成することで好みの形式で結果をだすことができ、簡単に結果を操作することができます。LINQを有効化した言語では完全な型の安全性と、クエリのコンパイル時間のチェック、またLINQコードを書く時にインテリセンス、デバッグ、リッチリファクタリングを全てサポートする開発ツールを提供することができます。
LINQは、データソースに対して非常に効率的なドメイン特定のオペレータの作成を促進する非常にリッチな拡張性のあるモデルをサポートしています。.NET Frameworkの"Orcas"バージョンはライブラリがビルドされるため、オブジェクト、XML、データベースをサポートするLINQを有効化することができます。
LINQ to SQLとは何?
LINQ to SQL とは、 .NET Framework "Orcas"リリースで出荷されるO/RM (オブジェクトリレーショナルマッピング)の実装のことです。これにより、.NETクラスを使用してリレーショナルデータベースをモデル化することができます。そして、LINQを使用してデータベースの検索、またそこからデータの更新・挿入・削除も行うことができます。
LINQ to SQLはトランザクション、ビュー、ストアドプロシジャーの全てをサポートしています。また、データモデルに対して、簡単にデータ検証とビジネスロジックのルールを統合する方法も提供しています。
LINQ to SQLを使用したデータベースのモデリング:
Visual Studio "Orcas"はLINQ to SQL デザイナとともに出荷されます。そのため、LINQ to SQLオブジェクトモデルとしてデータベースを簡単にモデル化および視覚化する方法が提供されます。次の投稿でこのデザイナの使用方法を深くカバーしたいと思います。(最初からLINQ to SQLモデルを作成している私のことをこのビデオ で見ることが出来ます。)
LINQ to SQLデザイナを使用すれば、以下のようにサンプルデータベースの"Northwind"の表現を簡単に作成することができます。:
上記のLINQ to SQLデザイン・サーフェイスでは4つのクラス(Product、Category、Order、OrderDetail)を定義しています。各クラスのプロパティはデータベースの各対応テーブルのカラムにマップされます。クラスのエンティティの各インスタンスはデータベーステーブルの1行を表します。
上記の4つのエンティティクラス間の矢印は異なるエンティティ間での関係・関連を表します。これらは通常データベース上でプライマリキーや外部キーの関係を使用してモデル化されます。デザインサーフェイス上の矢印の方向は、関係が1対1もしくは1対複数の関係にあるかを示しています。強く型付けされたプロパティはこれに応じてエンティティクラスに追加されます。例えば、上記のCategoryクラスはProductクラスで1対複数の関係を持っています。これはカテゴリ内でProductオブジェクトのコレクションである"Category"プロパティを持つことを意味しています。Product クラスは"Category "プロパティを持っていて、それはCategory クラスインスタンスをポイントしており、それがProduct に属しているCategory を表します。
上記のLINQ to SQLデザインサーフェイス内の右側のメソッドペインには、データベースモデルと相互作用するストアドプロシジャーのリストが含まれています。上記のサンプルの中にシングルの "GetProductsByCategory" SPROCを追加しました。入力引数としてcategoryID を取り、結果として製品エンティティのシーケンスを返します。以下のサンプルコードの中でこのSPROC がどのように呼ばれるか見てみましょう。
DataContext クラスの理解
LINQ to SQLデザインサーフェイスの中で"保存"ボタンを押す時、Visual Studioはエンティティとモデル化したデータベースの関係を表す.NETクラスの出力を続けます。ソリューションに追加された各LINQ to SQL デザイナファイルに対して、カスタムのDataContext クラスも生成されます。このDataContext クラスはメインのコンジットで、これでデータベースからエンティティを検索したり、変更を適用したりします。作成されたDataContext クラスは、データベース内でモデル化した各テーブルを表すプロパティと追加した各ストアドプロシジャーに対するメソッドを持っています。
例えば、以下はNorthwindDataContext クラスで、上記でデザインしたモデルに基づいて持続されます。

LINQ to SQL コード例
LINQ to SQLデザイナを使用してデータベースをモデル化すれば、それに対して簡単にコードを書くことができるようになります。以下は共通のデータタスクを紹介するためのコードサンプルです。
1) データベースからProductを検索
以下のコードではLINQクエリシンタックスを使用してProduct オブジェクトのIEnumerable シーケンスを取得します。コードが"Beverages"カテゴリにあるそれらの製品のみ取得するためにProduct/Category の関係をコードがどのように検索しているかに注意。
C#:
VB:
2) データベースのProductを更新
以下のコードはデータベースから1つの製品をどのように検索し、その価格を更新、そしてデータベースへ変更を保存する方法を表しています。
C#:
VB:
注: "Orcas"ベータ1のVBはLambdasをまだサポートしていません。 ベータ2ではそうなります。 - その時には上記のクエリはもっと簡潔に書き換えられている可能性があります。
3) 新しいCategory と2つの新しいProductをデータベースに挿入
以下のコードは新しいカテゴリーを作成して、2つの新しい製品を作成し、カテゴリと製品を関連付ける方法を表しています。そして、3つは全てデータベースに保存されます。
手動でプライマリキー・外部キーの関係を管理する必要が無い理由を以下で確認してください。その代わり、製品オブジェクトをカテゴリの製品コレクションに追加し、そしてDataContextのカテゴリコレクションにカテゴリオブジェクトを追加することによって、LINQ to SQLは、自動的に適切なPK/FK関係を持続することを知ることになります。
C#
VB:
4) データベースからProductを削除
以下のコードは全てのToy製品をデータベースから削除する方法を表しています。
C#:
VB:
5) ストアドプロシジャーを呼びだす
以下のコードは製品エンティティをLINQクエリシンタックスを使用しないで、代わりに上記でデータモデルに追加した"GetProductsByCategory"ストアドプロシジャーを呼びだすことによって、取得する方法を表しています。Productの結果を一度取得すると、それらを更新・削除できるようになり、データベースに修正を持続させるためにdb.SubmitChanges() を呼びだすことができるようになります。
C#:
VB:
6) サーバーサイドページングでProductを取得
以下のコードはLINQクエリの一部として、効果的なサーバーサイドデータベースページングを実装する方法を表しています。以下のSkip()およびTake()演算子を使用することで、200行から始めて、データベースから10行だけを返します。
C#:
VB:
まとめ
LINQ to SQLはアプリケーションのデータ層を上手く・きれいにモデル化する方法を提供しています。一度データモデルを定義すれば、クエリを実行し、それに対して挿入、更新、削除を簡単で効率的に行うことができます。
上記のイントロダクションとコードサンプルによりもっと詳細が知りたいと思っていただければ幸いです。次の数週間は、このLINQ to SQLシリーズを詳細に探索し続けていきます。
Hope this helps,
Scott