テーブル値関数 (TVF)

Note

EF5 以降のみ - このページで説明する機能、API などは、Entity Framework 5 で導入されました。 以前のバージョンを使用している場合、一部またはすべての情報は適用されません。

ビデオとステップ バイ ステップのチュートリアルでは、Entity Framework Designer を使用してテーブル値関数 (TVF) をマップする方法について説明します。 また、LINQ クエリから TVF を呼び出す方法についても説明します。

現在、TVF は Database First ワークフローでのみサポートされています。

TVF のサポートは Entity Framework バージョン 5 で導入されました。 テーブル値関数、列挙型、空間型などの新機能を使用するには、.NET Framework 4.5 をターゲットにする必要があることに注意してください。 既定では、Visual Studio 2012 は .NET 4.5 をターゲットにしています。

TVF はストアド プロシージャとよく似ていますが、TVF の結果はコンポーザブルであるという重要な違いが 1 つあります。 つまり、TVF の結果は LINQ クエリで使用できますが、ストアド プロシージャの結果は使用できません。

ビデオを見る

発表者: Julia Kornich

WMV | MP4 | WMV (ZIP)

前提条件

このチュートリアルを完了するには、次を行う必要があります。

プロジェクトをセットアップする

  1. Visual Studio を開きます
  2. [ファイル] メニューの [新規作成] をポイントし、[プロジェクト] をクリックします
  3. 左ペインで [Visual C#] をクリックし、[コンソール] テンプレートを選択します
  4. プロジェクトの名前として「TVF」と入力し、[OK] をクリックします

TVF をデータベースに追加する

  • [表示] -> [SQL Server オブジェクト エクスプローラー] を選択します
  • LocalDB がサーバーの一覧に表示されていない場合は、[SQL Server] を右クリックし、[SQL Server の追加] を選択します 既定の Windows 認証を使用して、LocalDB サーバーに接続します
  • [LocalDB] ノードを展開します
  • [データベース] ノードで、[School] データベース ノードを右クリックし、[新しいクエリ] を選択します
  • T-SQL エディターに、次の TVF 定義を貼り付けます
CREATE FUNCTION [dbo].[GetStudentGradesForCourse]

(@CourseID INT)

RETURNS TABLE

RETURN
    SELECT [EnrollmentID],
           [CourseID],
           [StudentID],
           [Grade]
    FROM   [dbo].[StudentGrade]
    WHERE  CourseID = @CourseID
  • T-SQL エディターでマウスの右ボタンをクリックし、[実行] を選択します
  • GetStudentGradesForCourse 関数が School データベースに追加されます

 

Create a Model (モデルの作成)

  1. ソリューション エクスプローラーで、プロジェクト名を右クリックして [追加] をポイントし、[新しい項目] をクリックします
  2. 左側のメニューから [データ] を選択し、[テンプレート] ペインの [ADO.NET Entity Data Model] を選択します
  3. ファイル名として「TVFModel.edmx」と入力し、[追加] をクリックします
  4. [モデルのコンテンツの選択] ダイアログ ボックスで、[データベースから生成] を選択し、[次へ] をクリックします
  5. [新しい接続] をクリックします [サーバー名] テキスト ボックスに「(localdb)\mssqllocaldb」と入力します データベース名として「School」と入力します [OK] をクリックします
  6. [データベース オブジェクトの選択] ダイアログ ボックスの [テーブル] ノードで、[Person][StudentGrade][Course] の各テーブルを選択します
  7. [ストアド プロシージャと関数] ノードの下にある [GetStudentGradesForCourse] 関数を選択します 注: Visual Studio 2012 以降、Entity Designer では、ストアド プロシージャと関数を一括でインポートできるようになりました
  8. [完了] をクリックします。
  9. モデルを編集するためのデザイン サーフェイスを提供する Entity Designer が表示されます。 [データベース オブジェクトの選択] ダイアログ ボックスで選択したすべてのオブジェクトがモデルに追加されます。
  10. 既定では、インポートされた各ストアド プロシージャまたは関数の結果の形状は、エンティティ モデル内では自動的に新しい複合型になります。 しかし、GetStudentGradesForCourse 関数の結果は StudentGrade エンティティにマップする必要があります。デザイン画面を右クリックし、[モデル ブラウザー] を選択します モデル ブラウザーで、[関数インポート] を選択し、[GetStudentGradesForCourse] 関数をダブルクリックします [関数インポートの編集] ダイアログ ボックスで、[エンティティ] を選択し、[StudentGrade] を選択します

データの永続化と取得

Main メソッドが定義されているファイルを開きます。 Main 関数に次のコードを追加します。

次のコードは、テーブル値関数を使用するクエリを作成する方法を示しています。 このクエリによって、関連するコース タイトルと、評価が 3.5 以上の関連する学生を含む匿名型に結果が射影されます。

using (var context = new SchoolEntities())
{
    var CourseID = 4022;
    var Grade = 3.5M;

    // Return all the best students in the Microeconomics class.
    var students = from s in context.GetStudentGradesForCourse(CourseID)
                            where s.Grade >= Grade
                            select new
                            {
                                s.Person,
                                s.Course.Title
                            };

    foreach (var result in students)
    {
        Console.WriteLine(
            "Couse: {0}, Student: {1} {2}",
            result.Title,  
            result.Person.FirstName,  
            result.Person.LastName);
    }
}

アプリケーションをコンパイルして実行します。 このプログラムの出力は、次のようになります。

Couse: Microeconomics, Student: Arturo Anand
Couse: Microeconomics, Student: Carson Bryant

まとめ

このチュートリアルでは、Entity Framework Designer を使用してテーブル値関数 (TVF) をマップする方法について説明しました。 また、LINQ クエリから TVF を呼び出す方法についても説明しました。