SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

VS 2008を利用したASP.NET 3.5の開発方法を学習する

Visual Studio 2008で進化するASP.NET 3.5の開発手法(後篇)

VS 2008を利用したASP.NET 3.5の開発方法を学習する 3


LINQ対応

 ここまでに何度か述べてきたように、.NET Framework 3.5からLINQと呼ばれる技術が登場します。

 LINQとは、Language Integrated Query(統合言語クエリ)の略で、.NET Frameworkに新たに追加された革新的な言語埋め込みクエリ技術です。具体的に言うと、リレーショナルデータベースやXML、オブジェクトなど、さまざまなデータに対して同一形式のクエリ処理を記述することができます(図28)。VS 2008を利用して開発を行う際、さまざまな場面でLINQのクエリ式は使用されることになるかと思います。本項ではLINQ to SQLを使ったSQL Serverに対するLINQのコーディング部分に焦点を絞って紹介します。

図28 LINQの概念図
図28 LINQの概念図

ページにLINQのクエリ式を記述する

 前述したLINQ to SQLを利用するもう1つの方法は、ページにLINQのクエリを記述することです。LINQ to SQLクラスでDataContextオブジェクトを生成した後、コードビハインドのファイルにLINQを利用してクエリを直接記述することで、データソースコントロールを介することなく、データ表示ができます(図29)。

図29 サンプルの実行結果
図29 サンプルの実行結果

 DataSourceコントロールを使用せずに、GridViewコントロールのみでデータ表示できるのは、LINQクエリがIEnumerableインターフェイスか、それを継承したインターフェイスを実装した結果を返すからです。

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"」と同義のクエリを記述しています。

VBファイルにおけるLINQのサンプル
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
CSファイルにおけるLINQのサンプル
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のようになります。

図30 サンプルの実行結果
図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"」と同義のクエリが記述されます。

VBファイルにおけるLINQのサンプル
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
CSファイルにおけるLINQのサンプル
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に触れてみてください。

参考資料

  1. ASP.NET AJAX(公式ページ:英語)
  2. ScottGu's Blog(英語)
  3. Chica's Blog
  4. LINQ: .NET 統合言語クエリ
  5. LINQ to SQL: リレーショナル データのための .NET 統合言語クエリ
  6. Rick Strahl's Web Log
 

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
VS 2008を利用したASP.NET 3.5の開発方法を学習する連載記事一覧

もっと読む

この記事の著者

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

WINGSプロジェクト ナオキ(ナオキ)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。 2026年時点での登録メンバは約50名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/2023 2008/08/21 21:17

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー