Entity Framework - funkcja wyceniana w tabeli
W tym rozdziale nauczmy się, jak mapować funkcje o wartościach tabelarycznych (TVF) przy użyciu Entity Framework Designer i jak wywołać TVF z zapytania LINQ.
TVF są obecnie obsługiwane tylko w przepływie pracy Database First.
Został po raz pierwszy wprowadzony w Entity Framework w wersji 5.
Aby korzystać z TVF, musisz kierować na .NET Framework 4.5 lub nowszy.
Jest bardzo podobny do procedur składowanych, ale ma jedną kluczową różnicę, tj. Wynik TVF można komponować. Oznacza to, że wyniki z TVF mogą być używane w zapytaniu LINQ, podczas gdy wyniki procedury składowanej nie mogą.
Spójrzmy na poniższy przykład tworzenia nowego projektu z Plik → Nowy → Projekt.
Step 1 - Wybierz aplikację konsoli ze środkowego panelu i wprowadź TableValuedFunctionDemo w polu nazwy.
Step 2 - W eksploratorze serwerów kliknij prawym przyciskiem myszy bazę danych.
Step 3 - Wybierz Nowe zapytanie i wprowadź następujący kod w edytorze T-SQL, aby dodać nową tabelę do bazy danych.
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 - Kliknij prawym przyciskiem myszy edytor i wybierz opcję Wykonaj.
Step 5- Kliknij prawym przyciskiem myszy swoją bazę danych i kliknij Odśwież. Zobaczysz nowo dodaną tabelę w swojej bazie danych.
Step 6- Teraz utwórz funkcję, która będzie zwracać oceny uczniów z kursu. Wprowadź następujący kod w edytorze T-SQL.
CREATE FUNCTION [dbo].[GetStudentGradesForCourse]
(@CourseID INT)
RETURNS TABLE
RETURN
SELECT [EnrollmentID],
[CourseID],
[StudentID],
[Grade]
FROM [dbo].[StudentGrade]
WHERE CourseID = @CourseID
Step 7 - Kliknij prawym przyciskiem myszy edytor i wybierz opcję Wykonaj.
Teraz możesz zobaczyć, że funkcja została utworzona.
Step 8 - Kliknij prawym przyciskiem myszy nazwę projektu w Eksploratorze rozwiązań i wybierz Dodaj → Nowy element.
Step 9 - Następnie wybierz ADO.NET Entity Data Model w okienku Szablony.
Step 10 - Wpisz TVFModel jako nazwę, a następnie kliknij przycisk Dodaj.
Step 11 - W oknie dialogowym Wybierz zawartość modelu wybierz projektanta EF z bazy danych, a następnie kliknij przycisk Dalej.
Step 12 - Wybierz bazę danych i kliknij Dalej.
Step 13 - W oknie dialogowym Wybierz obiekty bazy danych wybierz tabele, widoki.
Step 14 - Wybierz funkcję GetStudentGradesForCourse znajdującą się w węźle Stored Procedures and Functions i kliknij Finish.
Step 15 - Wybierz View → Other Windows → Entity Data Model Browser i kliknij prawym przyciskiem myszy GetStudentGradesForCourse w sekcji Import funkcji i wybierz Edytuj.
Zobaczysz następujące okno dialogowe.
Step 16 - Kliknij przycisk radiowy Entities i wybierz Enrollment z pola combo jako typ zwrotu tej funkcji i kliknij OK.
Przyjrzyjmy się poniższemu kodowi C #, w którym zostaną pobrane oceny wszystkich uczniów, którzy są zapisani na identyfikator kursu = 4022 w bazie danych.
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();
}
}
}
Kiedy powyższy kod zostanie skompilowany i wykonany, otrzymasz następujący wynik -
Student ID: 1, Grade: 2
Student ID: 4, Grade: 4
Student ID: 9, Grade: 3.5
Zalecamy wykonanie powyższego przykładu krok po kroku w celu lepszego zrozumienia.