特集:Visual Studio 2008 SP1新機能解説(2)

.NETの新データアクセス・テクノロジ
「ADO.NET Entity Framework」

WINGSプロジェクト ナオキ/山田 祥寛
2008/11/28
Page1 Page2 Page3 Page4

■Entity SQLを利用してEntity Clientにクエリを行う

 Entity ClientはSystem.Data.EntityClient名前空間のクラスで利用できるデータ・プロバイダだ。

 Entity Clientプロバイダの利用は、従来のADO.NETのデータ・プロバイダの利用とほとんど同様である。つまり、EntityConnectionクラスを利用してEDMへのアクセスを行い、EntityCommandクラスを用いてEDMにクエリを行い、EntityDataReaderクラスがクエリの結果を返す。従来のADO.NETとの違いは、

  • 対象がデータベースそのものではなくEDMである
  • Transact-SQLの代わりに「Entity SQL」を使用する

という点だけだ。

EntityClient SqlClient
アクセス対象 EDM SQL Server
データへの接続 EntityConnectionクラス SqlConnectionクラス
実行するコマンド EntityCommandクラス SqlCommandクラス
データの読み取り EntityDataReaderクラス SqlDataReaderクラス
表2 System.Data.EntityClientとSystem.Data.SqlClientの比較

 Entity SQLはTransact-SQLとは異なり、EDMをサポートするために新しく提供されている問い合わせ言語だ。Entity SQLを使用することで、EDMで表現されるデータに対するクエリを効率的に実行できる。

 つまり、Entity Clientは、利用すべきエンティティの内容とEntity SQLの構文さえ押さえているならば利用しやすいという特徴がある。また、細かな制御ができるため、プログラム内でクエリを動的に変更できる動的クエリの作成に適している。この点からアドホック・クエリにも活用しやすいといえるだろう。

 ただし、Entity Framework 1.0のEntity SQLは、DML(Data Manipulation Language:データ操作言語。検索・追加・更新・削除を行うSELECT/INSERT/UPDATE/DELETE命令を指す)の中でもSELECT命令しかサポートしていない。つまり、Entity SQLではINSERT/DELETE/UPDATE命令を利用することはできないので要注意。

 以下のコードは、実際にEntity ClientとEntity SQLを利用した例だ。

using System.Data; // この行はリストの先頭部分に追加
using System.Data.EntityClient; // この行はリストの先頭部分に追加

protected void Page_Load(object sender, EventArgs e)
{
  // Connectionの作成
  using (EntityConnection con
              = new EntityConnection("Name=PubsEntities"))
  {
    con.Open();
    // CommandでEntity SQLによるクエリを実行
    // (royaltyプロパティが12未満のものを抽出)
    using (EntityCommand cmd = new EntityCommand("SELECT VALUE c FROM PubsEntities.titles AS c WHERE c.royalty < 12", con))
    {
      // Commandの結果をDataReaderを通して返す
      using (EntityDataReader rdr
            = cmd.ExecuteReader(CommandBehavior.SequentialAccess))
      {
        // GridView1にデータをバインディングする
        GridView1.DataSource = rdr;
        GridView1.DataBind();
        con.Close();
      }
    }
  }
}
Imports System.Data ' この行はリストの先頭部分に追加
Imports System.Data.EntityClient ' この行はリストの先頭部分に追加

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

  ' Connectionの作成
  Using con As New EntityConnection("Name=PubsEntities")
    con.Open()

    ' CommandでEntity SQLによるクエリを実行
    '(royaltyプロパティが12未満のものを抽出)
    Using cmd As New EntityCommand("SELECT VALUE c FROM PubsEntities.titles AS c WHERE c.royalty < 12", con)

      ' Commandの結果をDataReaderを通して返す
      Using erd As EntityDataReader _
            = cmd.ExecuteReader(CommandBehavior.SequentialAccess)

        ' GridView1にデータをバインディングする
        GridView1.DataSource = erd
        GridView1.DataBind()
        con.Close()
      End Using
    End Using
  End Using
End Sub
リスト1 Entity ClientとEntity SQLを利用してPubsEntitiesオブジェクトからroyaltyプロパティが12以下のレコードを取得し、GridView1にバインディングするコード(上:C#版、下:VB版)

 リスト1において、PubsEntitiesとは、EDMの中で定義されたPubsエンティティ型のオブジェクトである。ここでは、RDBのPubsデータベースに相当する。Entity SQLを利用する場合、この自動生成されたPubsEntitiesオブジェクトに対してEntity Clientからクエリを発行することになる。

 Entity SQLは一見するとTransact-SQLに酷似しているが、微妙に違いもある。Entity SQLで利用できるステートメントは以下のようになる。これに併せて、次項で解説するQuery Builderメソッドもここで記述しておく。

Entity SQL
ステートメント
Query Builder
メソッド
Transact-SQL
での利用
概要
DISTINCT Distinct
クエリ結果で重複している値をまとめる
EXCEPT Except
左辺のクエリ式の結果から右辺のクエリ式の結果を除いた値のコレクションを返す
GROUP BY GroupBy
クエリ結果をグループ化
INTERSECT Intersect
左右のクエリ式の交差結果のコレクションを返す
OFTYPE OfType
×
指定された型のオブジェクト・コレクションを返す
ORDER BY OrderBy
クエリ結果の並べ替えを行う
SELECT Select
クエリ式の結果の選択されたデータ・レコードを返す
SELECT VALUE SelectValue
1つの項目のみ指定し、クエリ式の結果を返す
SKIP Skip
×
指定した数だけ結果をスキップし、その次の行を返す
TOP Top
SELECT句のクエリ結果の先頭から指定した数の行を返す
LIMIT 該当メソッドなし
×
ORDER BY句の並べ替えの結果から指定した件数だけクエリの結果を取得
UNION Union
複数のコレクションを結合して返す
UNION ALL UnionAll
複数のコレクションを重複も含めて返す
WHERE Where
クエリ結果に条件を指定する
表3 Entity SQL/Query Builderで利用できるステートメント

 この表からも、Query BuilderメソッドとEntity SQLステートメントとがほぼ1対1の対応関係にあることを確認いただけるだろう。このため、Entity SQLと、Query Builderメソッドをそれぞれ利用する場合にも異なるステートメントを覚える必要がなく、状況に応じた使い分けが行いやすいのが特徴だ。

 Entity SQLの一般的な構文は、次のとおりである。

SELECT VALUE 変数1 FROM エンティティ・オブジェクト.エンティティ・テーブル AS 変数1 WHERE 変数1.条件式
SELECT VALUE句とWHERE句を使った基本的なEntity SQL構文

 Transact-SQL構文との大きな違いは「*」パラメータが使えないことと、FROM句からエンティティ・テーブルを参照して、レコード全体にクエリを投影する点だ。

 Entity SQLに関するより詳細な情報はMSDNの「Entity SQL リファレンス」を参照いただきたい。


 INDEX
  Visual Studio 2008 SP1新機能解説(1)
  DBアプリをコーディングレスで構築する「ASP.NET Dynamic Data」
    1.Dynamic Dataアプリケーションの基本
    2.データ・モデルの作成/Global.asaxの編集
    3.メタデータ編集によるDynamic Dataアプリケーションのカスタマイズ
    4.自作ユーザー・コントロールの利用/ページ・テンプレートのカスタマイズ
 
  Visual Studio 2008 SP1新機能解説(2)
  .NETの新データアクセス・テクノロジ「ADO.NET Entity Framework」
    1.ADO.NET Entity Framework概要
    2.Entity Data Model(EDM)の作成と利用
  3.EDMに対するクエリの利用方法(Entity SQL)
    4.EDMに対するクエリの利用方法(Object Services/LINQ to Entities)
 
  Visual Studio 2008 SP1新機能解説(3)
  RESTスタイルのWebサービスを手軽に公開する「ADO.NET Data Services」
    1.ADO.NET Data Services概要/対応するクライアント
    2.サンプル − ADO.NET Data Servicesの公開
    3.ASP.NET AJAX環境のデータを取得/追加する


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間