Entity-framework-entity-table-valued-function

提供:Dev Guides
移動先:案内検索

Entity Framework-テーブル値関数

この章では、Entity Framework Designerを使用してテーブル値関数(TVF)をマップする方法と、LINQクエリからTVFを呼び出す方法を学習します。

  • TVFは現在、Database Firstワークフローでのみサポートされています。
  • Entity Frameworkバージョン5で初めて導入されました。
  • TVFを使用するには、.NET Framework 4.5以上をターゲットにする必要があります。
  • ストアドプロシージャに非常に似ていますが、1つの重要な違いがあります。つまり、TVFの結果は構成可能です。 つまり、TVFの結果はLINQクエリで使用できますが、ストアドプロシージャの結果は使用できません。

ファイル→新規→プロジェクトから新しいプロジェクトを作成する次の例を見てみましょう。

プロジェクトの作成

  • ステップ1 *-中央のペインからコンソールアプリケーションを選択し、名前フィールドにTableValuedFunctionDemoと入力します。
  • ステップ2 *-サーバーエクスプローラーで、データベースを右クリックします。

エクスプローラーデータベース

  • ステップ3 *-[新しいクエリ]を選択し、T-SQLエディターに次のコードを入力して、データベースに新しいテーブルを追加します。
IF NOT EXISTS (SELECT * FROM sys.objects WHERE object_id =
   OBJECT_ID(N'[dbo].[StudentGrade]') AND type in (N'U'))

BEGIN

   CREATE TABLE [dbo].[StudentGrade](

      [EnrollmentID] [int] IDENTITY(1,1) NOT NULL,
      [CourseID] [int] NOT NULL,
      [StudentID] [int] NOT NULL,
      [Grade] [decimal](3, 2) NULL,

      CONSTRAINT [PK_StudentGrade] PRIMARY KEY CLUSTERED ([EnrollmentID] ASC)

      WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]

   ) ON [PRIMARY]

END
GO
  • ステップ4 *-エディターを右クリックして、[実行]を選択します。

実行の選択

  • ステップ5 *-データベースを右クリックして、更新をクリックします。 データベースに新しく追加されたテーブルが表示されます。

テーブルを追加

  • ステップ6 *-コースの学生の成績を返す関数を作成します。 T-SQLエディターで次のコードを入力します。
CREATE FUNCTION [dbo].[GetStudentGradesForCourse]

(@CourseID INT)

RETURNS TABLE

RETURN
   SELECT [EnrollmentID],
      [CourseID],
      [StudentID],
      [Grade]
   FROM   [dbo].[StudentGrade]
   WHERE  CourseID = @CourseID
  • ステップ7 *-エディターを右クリックして、[実行]を選択します。

エディター選択

これで、関数が作成されたことがわかります。

作成された関数

  • ステップ8 *-ソリューションエクスプローラーでプロジェクト名を右クリックし、[追加]→[新しいアイテム]を選択します。
  • ステップ9 *-次に、[テンプレート]ペインで[ADO.NETエンティティデータモデル]を選択します。

エンティティテンプレートペイン

  • ステップ10 *-名前としてTVFModelを入力し、[追加]をクリックします。
  • ステップ11 *-[モデルコンテンツの選択]ダイアログボックスで、データベースからEFデザイナーを選択し、[次へ]をクリックします。

コンテンツダイアログボックス

  • ステップ12 *-データベースを選択して、[次へ]をクリックします。

データベースの選択

  • ステップ13 *-[データベースオブジェクトの選択]ダイアログボックスで、テーブル、ビューを選択します。

オブジェクトダイアログボックス

  • ステップ14 *-[ストアドプロシージャと関数]ノードの下にあるGetStudentGradesForCourse関数を選択し、[完了]をクリックします。
  • ステップ15 *-[表示]→[他のウィンドウ]→[エンティティデータモデルブラウザー]を選択し、[関数のインポート]で[GetStudentGradesForCourse]を右クリックして[編集]を選択します。

ビューの選択

次のダイアログが表示されます。

ダイアログ

  • ステップ16 *-[エンティティ]ラジオボタンをクリックし、この関数の戻り値のタイプとしてコンボボックスから[登録]を選択し、[OK]をクリックします。

データベースのコースID = 4022に登録されているすべての学生の成績が取得される次のC#コードを見てみましょう。

class Program {

   static void Main(string[] args) {

      using (var context = new UniContextEntities()) {

         var CourseID = 4022;

        //Return all the best students in the Microeconomics class.
         var students = context.GetStudentGradesForCourse(CourseID);

         foreach (var result in students) {
            Console.WriteLine("Student ID:  {0}, Grade: {1}",
               result.StudentID, result.Grade);
         }

         Console.ReadKey();
      }
   }
}

上記のコードをコンパイルして実行すると、次の出力が表示されます-

Student ID: 1, Grade: 2
Student ID: 4, Grade: 4
Student ID: 9, Grade: 3.5

理解を深めるために、上記の例を段階的に実行することをお勧めします。