LINQ対応
ここまでに何度か述べてきたように、.NET Framework 3.5からLINQと呼ばれる技術が登場します。
LINQとは、Language Integrated Query(統合言語クエリ)の略で、.NET Frameworkに新たに追加された革新的な言語埋め込みクエリ技術です。具体的に言うと、リレーショナルデータベースやXML、オブジェクトなど、さまざまなデータに対して同一形式のクエリ処理を記述することができます(図28)。VS 2008を利用して開発を行う際、さまざまな場面でLINQのクエリ式は使用されることになるかと思います。本項ではLINQ to SQLを使ったSQL Serverに対するLINQのコーディング部分に焦点を絞って紹介します。
ページにLINQのクエリ式を記述する
前述したLINQ to SQLを利用するもう1つの方法は、ページにLINQのクエリを記述することです。LINQ to SQLクラスでDataContextオブジェクトを生成した後、コードビハインドのファイルにLINQを利用してクエリを直接記述することで、データソースコントロールを介することなく、データ表示ができます(図29)。
DataSourceコントロールを使用せずに、GridViewコントロールのみでデータ表示できるのは、LINQクエリがIEnumerableインターフェイスか、それを継承したインターフェイスを実装した結果を返すからです。
IEnumerableインターフェイスは、コレクションに対して反復処理を行う列挙子を利用できるようにします。 IEnumerableインターフェイスは、ASP.NETサーバーコントロールがオブジェクトをデータバインドする時のインターフェイスでもあります。つまり、LINQ to SQLに限らず、LINQ to XMLやLINQ to Objectsの結果でもASP.NETのサーバーコントロールにデータバインドできます。
肝心のクエリについてですが、LINQ to SQLを利用した場合には最初にDataContextオブジェクトを生成する必要があります。また、DataContextオブジェクトを生成した後、テーブルの値を受け取る際に名前付きの型を利用することはほとんどないと考えられるため、LINQの値を受け取る型は匿名型を利用します (サンプルソースの「LINQSampleVB1(CS1).aspx」)。
LINQを利用する場合、クエリ式を利用することで、SQLライクな構文をプログラムの中に直接記述できます。また、クエリ式の特徴としてSelect句かGroup句の記述により処理が終了します。そのためFrom句が最初に、Select句が最後に記述されます。他にもC# 3.0の追加機能であるラムダ式や匿名メソッドなどがLINQの技術を支えます。詳しい技術情報はこちらの記事に書かれているので参照ください。本稿ではLINQのクエリ式の記述について理解いただければと思います。
下記のlist変数には「SELECT price,title,pubdate FROM titles WHERE type="trad_cook"」と同義のクエリを記述しています。
Protected Sub Page_Load(ByVal sender As Object, _ ByVal e As System.EventArgs) Handles Me.Load 'DataContextオブジェクトの生成 Dim db As New DataClassesDataContext() 'titlesテーブルにアクセスしtypeがtrad_cookである 'price,title,pubdateの列を取得 Dim list = From t In db.titles _ Where t.type = "trad_cook" _ Select New With { _ t.price, _ t.title, _ t.pubdate _ } 'LINQのクエリによりデータを取得したlist変数は 'IEnumerableインターフェイスを実装するため、 'ASP.NETコントロールに直接参照させる事ができる GridView1.DataSource = list GridView1.DataBind() End Sub
protected void Page_Load(object sender, EventArgs e) { DataClassesDataContext db = new DataClassesDataContext(); var list = from t in db.titles where t.type == "trad_cook" select new { t.price, t.title, t.pubdate, }; GridView1.DataSource=list; GridView1.DataBind(); }
LINQによるテーブル結合(同一データベース内のみ)
LINQ to SQLでは同一のデータベース内のみですが、テーブル結合もできます(サンプルソースの「LINQSampleVB2(CS2).aspx」)。ただし、これが行えるのはページにLINQのクエリを記述する場合のみです。
テーブル結合のポイントはLINQ to SQLデザイナ画面に結合したいテーブルを配置することと、クエリの記述時にJoin句をつけ加えるだけです。結合による実際のLINQ実行結果は図30のようになります。
下記のlist変数には「SELECT titles.price,titles.title,titles.pubdate,sales.ord_date FROM titles INNER JOIN sales ON titles.title_id EQUALS sales.title_id WHERE type="trad_cook"」と同義のクエリが記述されます。
Protected Sub Page_Load(ByVal sender As Object, _ ByVal e As System.EventArgs) Handles Me.Load Dim db As New DataClassesDataContext() 'titlesテーブルとsalesテーブルを結合し、 'typeがtrad_cookである 'price,title,pubdateの列を取得 Dim list = From t In db.titles _ Where t.type = "trad_cook" _ Join s In db.sales _ On t.title_id Equals s.title_id _ Select New With { _ t.price, _ t.title, _ t.pubdate, _ s.ord_date _ } GridView1.DataSource = list GridView1.DataBind() End Sub
protected void Page_Load(object sender, EventArgs e) { DataClassesDataContext db = new DataClassesDataContext(); var list = from t in db.titles where t.type == "trad_cook" join s in db.sales on t.title_id equals s.title_id select new { t.price, t.title, t.pubdate, s.ord_date }; GridView1.DataSource=list; GridView1.DataBind(); }
まとめ
以上、3回に渡ってVS 2008の新機能を紹介してきましたが、すべての機能は紹介しきれていません。特にLINQの技術、ASP.NET AJAXの技術については知らなくてはならない知識も大量にあります。本稿が事前の予習になれば幸いです。
また、MSDNサブスクリプションを利用していない方はVS 2008のパッケージを購入するのはまだ先になるかと思いますが、VWD 2008は無償でダウンロードできます。ぜひこちらをダウンロードして実際にVS 2008に触れてみてください。




