Entity Framework を使用してみます。Visual Studio 2008 Professional SP1 上で EDM (Entity Data Model) を作成してクエリを発行するまでの一連の手順を覚書として記載します。EDMに対するクエリ、LINQ to Entity を使用したクエリ、Entity SQL を使用したクエリの3種類の方法で発行してみます。

動作確認環境は次のとおり

  • 開発環境:Visual Studio 2008 SP1
  • .NET バージョン:.NET 3.5 SP1
  • DB:SQL Server 2005 Development Edition
  • 実行環境:Windows Server 2003 SP2

1. ソリューションの作成

Visual Studio 2008 を起動して、 プロジェクトを新規作成します。プロジェクトテンプレートに "Console プロジェクト"を選択し、プロジェクト名を HajimetenoEntityFramework という名前で新規作成します。

2. EDM (Entity Data Model の作成)

EDM(Entity Data Model) を作成します。ソリューションエクスプローラから、 作為性下 HajimetenoEntityFrameowrk プロジェクトを選択して、右クリック→追加→新しい項目を選択して、下記の新しい項目の追加ダイアログを表示します。テンプレートに ADO.NET Entity Data Model を選択し、既定の名前Model1.edmx でEDM を新規作成します。

Entity Data Model ウィザードが始まるので、データベースから生成を選択して次へボタンをクリックします。

EDM を作成する対象のデータベースへの接続を設定します。 データ接続のドロップダウンリストに対象のデータベースがリストされない場合は、"新しい接続"ボタンをクリックして接続文字列を構成してください。設定後、次へボタンをクリックします。

EDM に含めるテーブルやビュー, ストアドプロシージャを選択して完了ボタンをクリックします。

ウィザードが完了するとデータモデルが表示されます。あとは対象のEntityを選択して表示されるプロパティ画面でカスタマイズを行えるようになります。

今回は作成されたEDMに対してクエリを発行してみます。

3. Entity Framework を使用してクエリを発行する

EDMに対してクエリ(プロパティへのアクセス) をするサンプルと、LINQ to Entity を使用して データモデルにアクセスするサンプルを以下に記載します。HajimetenoQueryToEdm メソッドでは、 EDM に対してクエリを発行するメソッド。 HajimetenoLinqToEntity は LINQ to Entity を使用して LINQ 経由で EDM に対してクエリを発行するサンプルメソッドです。HajimetenoEntitySQL メソッドがEntity SQL を使用したサンプルです。そのほか,パラメタつきのEntitySQLや、 EntityClient を直接使用して処理をするサンプルもHajimetenoEntitySQLWithParameter(), HajimetenoEntityClient という名前で掲載しています。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace HajimetenoEntityFramework
{
    class Program
    {
        /// <summary>
        /// Edm に対するクエリとLINQ to Entity 
        /// を使用して取得を行う
        /// </summary>
        /// <param name="args"></param>
        static void Main(string[] args)
        {
            HajimetenoQueryToEdm();
            Console.ReadLine();

            HajimetenoLinqToEntity();
            Console.ReadLine();

            HajimetenoEntitySQL();
            Console.ReadLine();

            HajimetenoEntitySQLWithParameter();
            Console.ReadLine();

            HajimetenoEntityClient();
            Console.ReadLine();
        }
        /// <summary>
        /// カテゴリの一覧を表示
        /// </summary>
        static void HajimetenoQueryToEdm()
        {
            Console.WriteLine("初めてのEDMへのクエリ");

            using (var context = new ComponentEntities())
            {
                var categories = context.Category;

                foreach (var category in categories)
                {
                    Console.WriteLine("ID:{0}, 説明:{1}", category.CategoryID, category.Description);
                }
            }
        }
        /// <summary>
        /// コメントのある記事の一覧を表示
        /// </summary>
        static void HajimetenoLinqToEntity()
        {
            Console.WriteLine("初めてのLINQ to Entity");

            using (var context = new ComponentEntities())
            {
                var articles = context.Article;

                var query = from a in articles
                            where a.Comment.Count > 0
                            select a;

                Console.WriteLine("コメントのある記事");

                foreach (var article in query)
                {
                    Console.WriteLine("ID:{0}, タイトル:{1}", article.ArticleID, article.Title);
                }
            }
        }
        /// <summary>
        /// 記事ID が 10 以下
        /// </summary>
        static void HajimetenoEntitySQL()
        {
            Console.WriteLine("初めてのEntity SQL");

            using (var context = new ComponentEntities())
            {
                string query = "SELECT VALUE a FROM ComponentEntities.Article AS a "
                            + "WHERE a.ArticleID < 10";

                foreach (var article in context.CreateQuery<Article>(query))
                {
                    Console.WriteLine("ID:{0}, タイトル:{1}", article.ArticleID, article.Title);
                }

            }
        }
        /// <summary>
        /// パラメタを使用して記事ID が 10 以下の記事を検索するEntity SQL
        /// </summary>
        static void HajimetenoEntitySQLWithParameter()
        {
            Console.WriteLine("初めてのParameterized Entity SQL");

            using (var context = new ComponentEntities())
            {
                string query = "SELECT VALUE a FROM ComponentEntities.Article AS a "
                            + "WHERE a.ArticleID < @maxarticleid";

                var articles = new System.Data.Objects.ObjectQuery<Article>(query, context);
                articles.Parameters.Add(new System.Data.Objects.ObjectParameter("maxarticleid", 10));

                foreach (var article in articles)
                {
                    Console.WriteLine("ID:{0}, タイトル:{1}", article.ArticleID, article.Title);
                }

            }
        }
        /// <summary>
        /// 記事IDが10以下の列挙をEntityClient でやってみる
        /// </summary>
        static void HajimetenoEntityClient()
        {
            Console.WriteLine("初めてのEntityClient");

            using (System.Data.EntityClient.EntityConnection cn = new System.Data.EntityClient.EntityConnection("name=ComponentEntities"))
            {
                cn.Open();

                string query = "SELECT VALUE a FROM ComponentEntities.Article AS a "
                            + "WHERE a.ArticleID < 10";

                using (System.Data.EntityClient.EntityCommand cmd = cn.CreateCommand())
                {
                    cmd.CommandText = query;
                    using (System.Data.EntityClient.EntityDataReader reader = cmd.ExecuteReader(System.Data.CommandBehavior.SequentialAccess))
                    {
                        while (reader.Read())
                        {
                            int id = (int)reader["ArticleID"];
                            string title = reader["Title"] as string;
                            Console.WriteLine("ID:{0}, タイトル:{1}", id, title);
                        }
                    }
                }
            }
        }
    }
}

実行するとコマンドプロンプトに下図のような内容で結果が出力されます。

4. まとめ

今回の説明は以上です。Entity Framework を使い出したのでとりあえず使ってみるための覚書を記載しました。 
 誤り、指摘点などありましたらご連絡ください。