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

WMV | MP4 | WMV (ZIP)

Předpoklady

K dokončení tohoto návodu potřebujete:

Nastavení projektu

  1. Otevřete sadu Visual Studio.
  2. V nabídce Soubor přejděte na příkaz Nový a klepněte na příkaz Projekt
  3. V levém podokně klikněte na Visual C# a pak vyberte šablonu konzoly .
  4. 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

  1. 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.
  2. V nabídce vlevo vyberte Data a pak v podokně Šablony vyberte ADO.NET Model dat entity.
  3. Jako název souboru zadejte TVFModel.edmx a potom klepněte na tlačítko Přidat.
  4. V dialogovém okně Zvolit obsah modelu vyberte Vygenerovat z databáze a potom klepněte na tlačítko Další.
  5. Click New Připojení ion Enter (localdb)\mssqllocaldb in the Server name text box Enter School for the database name Click OK
  6. V dialogovém okně Zvolit databázové objekty v uzlu Tabulky vyberte tabulky Person, StudentGrade a Course
  7. 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í.
  8. Klikněte na Dokončit.
  9. 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 .
  10. 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.