Funzioni con valori di tabella (TVFS)

Nota

Solo EF5 e versioni successive : le funzionalità, le API e così via descritte in questa pagina sono state introdotte in Entity Framework 5. Se si usa una versione precedente, le informazioni qui riportate, o parte di esse, non sono applicabili.

Il video e la procedura dettagliata illustrano come eseguire il mapping di funzioni con valori di tabella tramite Entity Framework Designer. Viene inoltre illustrato come chiamare un file TVF da una query LINQ.

Le funzioni con valori televisivi sono attualmente supportate solo nel flusso di lavoro Database First.

Il supporto di TVF è stato introdotto in Entity Framework versione 5. Si noti che per usare le nuove funzionalità, ad esempio funzioni, enumerazioni e tipi spaziali con valori di tabella, è necessario specificare come destinazione .NET Framework 4.5. Visual Studio 2012 è destinato a .NET 4.5 per impostazione predefinita.

Le funzioni con valori di tabella sono molto simili alle stored procedure con una differenza fondamentale: il risultato di un file TVF è componibile. Ciò significa che i risultati di un file TVF possono essere usati in una query LINQ mentre i risultati di una stored procedure non possono.

Guarda il video

Presentato da: Julia Kornich

WMV MP4 | WMV | (ZIP)

Prerequisiti

Per completare questa procedura dettagliata, è necessario:

  • Installare il database School.

  • Disporre di una versione recente di Visual Studio

Configurare il progetto

  1. Aprire Visual Studio.
  2. Scegliere Nuovo dal menu File e quindi fare clic su Progetto
  3. Nel riquadro sinistro fare clic su Visual C#, quindi selezionare il modello console
  4. Immettere TVF come nome del progetto e fare clic su OK

Aggiungere un file TVF al database

  • Selezionare Visualizza -> SQL Server Esplora oggetti
  • Se Local DB non è incluso nell'elenco dei server: fare clic con il pulsante destro del mouse su SQL Server e scegliere Aggiungi SQL Server Usare l'autenticazione di Windows predefinita per connettersi al server Local DB
  • Espandere il nodo Local DB
  • Nel nodo Database fare clic con il pulsante destro del mouse sul nodo Database school e scegliere Nuova query...
  • Nell'editor T-SQL incollare la definizione TVF seguente
CREATE FUNCTION [dbo].[GetStudentGradesForCourse]

(@CourseID INT)

RETURNS TABLE

RETURN
    SELECT [EnrollmentID],
           [CourseID],
           [StudentID],
           [Grade]
    FROM   [dbo].[StudentGrade]
    WHERE  CourseID = @CourseID
  • Fare clic sul pulsante destro del mouse nell'editor T-SQL e selezionare Esegui
  • La funzione GetStudentGradesForCourse viene aggiunta al database School

 

Create a Model (Creare un modello)

  1. Fare clic con il pulsante destro del mouse sul nome del progetto in Esplora soluzioni, scegliere Aggiungi, quindi fare clic su Nuovo elemento
  2. Selezionare Dati dal menu a sinistra e quindi selezionare ADO.NET Entity Data Model nel riquadro Modelli
  3. Immettere TVFModel.edmx per il nome del file e quindi fare clic su Aggiungi
  4. Nella finestra di dialogo Scegli contenuto modello selezionare Genera dal database e quindi fare clic su Avanti
  5. Fare clic su Nuovo Connessione ion Immettere (localdb)\mssqllocaldb nella casella di testo Nome server Immettere School per il nome del database Fare clic su OK
  6. Nella finestra di dialogo Scegli oggetti di database, nel nodo Tabelle selezionare le tabelle Person, StudentGrade e Course
  7. Selezionare la funzione GetStudentGradesForCourse che si trova nel nodo Stored procedure e funzioni Nota, che a partire da Visual Studio 2012, Entity Designer consente di importare in batch le stored procedure e le funzioni
  8. Fare clic su Fine
  9. Viene visualizzato Entity Designer, che fornisce un'area di progettazione per la modifica del modello. Tutti gli oggetti selezionati nella finestra di dialogo Scegli oggetti di database vengono aggiunti al modello.
  10. Per impostazione predefinita, la forma del risultato di ogni stored procedure o funzione importata diventerà automaticamente un nuovo tipo complesso nel modello di entità. Tuttavia, si vuole eseguire il mapping dei risultati della funzione GetStudentGradesForCourse all'entità StudentGrade: fare clic con il pulsante destro del mouse sull'area di progettazione e selezionare Browser modello nel browser del modello, selezionare Importazioni di funzioni e quindi fare doppio clic sulla funzione GetStudentGradesForCourse Nella finestra di dialogo Modifica importazione funzione selezionare Entità e scegliere StudentGrade

Rendere persistenti e recuperare i dati

Aprire il file in cui è definito il metodo Main. Aggiungere il codice seguente alla funzione Main.

Il codice seguente illustra come compilare una query che usa una funzione con valori di tabella. La query proietta i risultati in un tipo anonimo che contiene il titolo del corso correlato e gli studenti correlati con un voto maggiore o uguale a 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);
    }
}

Compilare l'applicazione ed eseguirla. Il programma produce l'output seguente:

Couse: Microeconomics, Student: Arturo Anand
Couse: Microeconomics, Student: Carson Bryant

Riepilogo

In questa procedura dettagliata è stato illustrato come eseguire il mapping di funzioni con valori di tabella usando Entity Framework Designer. È stato anche illustrato come chiamare un file TVF da una query LINQ.