Funkce s hodnotami tabulky (TVF)
Poznámka
Pouze EF5 – funkce, rozhraní API atd. probírané na této stránce byly představeny v Entity Frameworku 5. Pokud používáte starší verzi, některé nebo všechny informace nemusí být platné.
Video a podrobný návod ukazuje, jak mapovat funkce s hodnotami tabulky (TVF) pomocí Návrháře entity Framework. Ukazuje také, jak volat TVF z dotazu LINQ.
TVF se v současné době podporují pouze v pracovním postupu První databáze.
Podpora TVF byla zavedena v Entity Frameworku verze 5. Všimněte si, že pokud chcete používat nové funkce, jako jsou tabulkové funkce, výčty a prostorové typy, musíte cílit na rozhraní .NET Framework 4.5. Visual Studio 2012 ve výchozím nastavení cílí na .NET 4.5.
TVF jsou velmi podobné uloženým procedurům s jedním klíčovým rozdílem: výsledek TVF je kompozovatelný. To znamená, že výsledky z TVF lze použít v dotazu LINQ, zatímco výsledky uložené procedury nemohou.
Přehrát video
Autor: Julia Kornich
Předpoklady
K dokončení tohoto návodu potřebujete:
Mít nedávnou verzi sady Visual Studio
Nastavení projektu
- Otevřete sadu Visual Studio.
- V nabídce Soubor přejděte na příkaz Nový a klepněte na příkaz Projekt
- V levém podokně klikněte na Visual C# a pak vyberte šablonu konzoly .
- Jako název projektu zadejte TVF a klikněte na OK.
Přidání TVF do databáze
- Výběr zobrazení –> Průzkumník objektů SQL Serveru
- Pokud localDB není v seznamu serverů: Klikněte pravým tlačítkem na SQL Server a vyberte Přidat SQL Server Použít výchozí ověřování systému Windows pro připojení k serveru LocalDB.
- Rozbalení uzlu LocalDB
- V uzlu Databáze klikněte pravým tlačítkem na uzel Školní databáze a vyberte Nový dotaz...
- V editoru T-SQL vložte následující definici TVF.
CREATE FUNCTION [dbo].[GetStudentGradesForCourse]
(@CourseID INT)
RETURNS TABLE
RETURN
SELECT [EnrollmentID],
[CourseID],
[StudentID],
[Grade]
FROM [dbo].[StudentGrade]
WHERE CourseID = @CourseID
- Klikněte na pravé tlačítko myši v editoru T-SQL a vyberte Spustit.
- Funkce GetStudentGradesForCourse se přidá do školní databáze.
Vytvoření modelu
- Klikněte pravým tlačítkem myši na název projektu v Průzkumník řešení, přejděte na příkaz Přidat a potom klikněte na položku Nová položka.
- V nabídce vlevo vyberte Data a pak v podokně Šablony vyberte ADO.NET Model dat entity.
- Jako název souboru zadejte TVFModel.edmx a potom klepněte na tlačítko Přidat.
- V dialogovém okně Zvolit obsah modelu vyberte Vygenerovat z databáze a potom klepněte na tlačítko Další.
- Click New Připojení ion Enter (localdb)\mssqllocaldb in the Server name text box Enter School for the database name Click OK
- V dialogovém okně Zvolit databázové objekty v uzlu Tabulky vyberte tabulky Person, StudentGrade a Course
- Vyberte funkci GetStudentGradesForCourse umístěnou pod uzlem Uložené procedury a funkce Poznámka: Počínaje sadou Visual Studio 2012 vám Návrhář entit umožňuje dávkový import uložených procedur a funkcí.
- Klikněte na Dokončit.
- Zobrazí se Návrhář entit, který poskytuje návrhovou plochu pro úpravy modelu. Do modelu se přidají všechny objekty, které jste vybrali v dialogovém okně Zvolit databázové objekty .
- Ve výchozím nastavení se tvar výsledku každé importované uložené procedury nebo funkce automaticky stane novým komplexním typem v modelu entity. Chceme ale namapovat výsledky funkce GetStudentGradesForCourse na entitu StudentGrade: Klikněte pravým tlačítkem myši na návrhovou plochu a vyberte Prohlížeč modelů v prohlížeči modelů, vyberte Import funkcí a potom poklikejte na funkci GetStudentGradesForCourse v dialogovém okně Upravit import funkce, vyberte Entity a zvolte StudentGrade.
Uchování a načtení dat
Otevřete soubor, ve kterém je definována metoda Main. Do funkce Main přidejte následující kód.
Následující kód ukazuje, jak vytvořit dotaz, který používá funkci s hodnotou tabulky. Dotaz prodá výsledky do anonymního typu, který obsahuje související název kurzu a související studenty se známkou vyšší nebo rovnou 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);
}
}
Zkompilujte a spusťte aplikaci. Program vytvoří následující výstup:
Couse: Microeconomics, Student: Arturo Anand
Couse: Microeconomics, Student: Carson Bryant
Souhrn
V tomto názorném postupu jsme se podívali, jak mapovat funkce s hodnotami tabulky (TVF) pomocí Návrháře entity Framework. Ukázalo se také, jak volat TVF z dotazu LINQ.