エンティティフレームワーク-テーブル値関数
この章では、Entity Framework Designerを使用してテーブル値関数(TVF)をマップする方法と、LINQクエリからTVFを呼び出す方法を学習します。
TVFは現在、DatabaseFirstワークフローでのみサポートされています。
これは、EntityFrameworkバージョン5で最初に導入されました。
TVFを使用するには、.NET Framework4.5以降をターゲットにする必要があります。
これはストアドプロシージャと非常に似ていますが、1つの重要な違いがあります。つまり、TVFの結果は構成可能です。つまり、TVFの結果はLINQクエリで使用できますが、ストアドプロシージャの結果は使用できません。
ファイル→新規→プロジェクトから新しいプロジェクトを作成する次の例を見てみましょう。
Step 1 −中央のペインからコンソールアプリケーションを選択し、名前フィールドにTableValuedFunctionDemoと入力します。
Step 2 −サーバーエクスプローラーでデータベースを右クリックします。
Step 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
Step 4 −エディターを右クリックして、「実行」を選択します。
Step 5−データベースを右クリックし、[更新]をクリックします。データベースに新しく追加されたテーブルが表示されます。
Step 6−次に、コースの学生の成績を返す関数を作成します。T-SQLエディターに次のコードを入力します。
CREATE FUNCTION [dbo].[GetStudentGradesForCourse]
(@CourseID INT)
RETURNS TABLE
RETURN
SELECT [EnrollmentID],
[CourseID],
[StudentID],
[Grade]
FROM [dbo].[StudentGrade]
WHERE CourseID = @CourseID
Step 7 −エディターを右クリックして、「実行」を選択します。
これで、関数が作成されたことがわかります。
Step 8 −ソリューションエクスプローラーでプロジェクト名を右クリックし、「追加」→「新規アイテム」を選択します。
Step 9 −次に、[テンプレート]ペインで[ADO.NETエンティティデータモデル]を選択します。
Step 10 −名前としてTVFModelを入力し、[追加]をクリックします。
Step 11 − [モデルコンテンツの選択]ダイアログボックスで、データベースからEFデザイナを選択し、[次へ]をクリックします。
Step 12 −データベースを選択し、[次へ]をクリックします。
Step 13 − [データベースオブジェクトの選択]ダイアログボックスで、テーブル、ビューを選択します。
Step 14 − [ストアドプロシージャと関数]ノードの下にあるGetStudentGradesForCourse関数を選択し、[完了]をクリックします。
Step 15 −「表示」→「その他のウィンドウ」→「エンティティデータモデルブラウザ」を選択し、「関数のインポート」の下の「GetStudentGradesForCourse」を右クリックして、「編集」を選択します。
次のダイアログが表示されます。
Step 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
理解を深めるために、上記の例を段階的に実行することをお勧めします。