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
理解を深めるために、上記の例を段階的に実行することをお勧めします。