Entity Framework - Funzione con valori di tabella
In questo capitolo, impareremo come mappare funzioni con valori di tabella (TVF) usando Entity Framework Designer e come chiamare un TVF da una query LINQ.
- I TVF sono attualmente supportati solo nel flusso di lavoro Database First. 
- È stato introdotto per la prima volta in Entity Framework versione 5. 
- Per utilizzare i TVF è necessario targetizzare .NET Framework 4.5 o versioni successive. 
- È molto simile alle stored procedure ma con una differenza fondamentale, ovvero il risultato di un TVF è componibile. Ciò significa che i risultati di un TVF possono essere utilizzati in una query LINQ mentre i risultati di una stored procedure non possono. 
Diamo un'occhiata al seguente esempio di creazione di un nuovo progetto da File → Nuovo → Progetto.
 
                Step 1 - Seleziona l'applicazione console dal riquadro centrale e inserisci TableValuedFunctionDemo nel campo del nome.
Step 2 - In Esplora server fare clic con il pulsante destro del mouse sul database.
 
                Step 3 - Seleziona Nuova query e inserisci il seguente codice nell'editor T-SQL per aggiungere una nuova tabella nel tuo database.
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
GOStep 4 - Fai clic con il pulsante destro del mouse sull'editor e seleziona Esegui.
 
                Step 5- Fare clic con il pulsante destro del mouse sul database e fare clic su Aggiorna. Vedrai la tabella appena aggiunta nel tuo database.
 
                Step 6- Ora crea una funzione che restituirà i voti degli studenti per il corso. Immettere il codice seguente nell'editor T-SQL.
CREATE FUNCTION [dbo].[GetStudentGradesForCourse]
(@CourseID INT)
RETURNS TABLE
RETURN
   SELECT [EnrollmentID],
      [CourseID],
      [StudentID],
      [Grade]
   FROM   [dbo].[StudentGrade]
   WHERE  CourseID = @CourseIDStep 7 - Fai clic con il pulsante destro del mouse sull'editor e seleziona Esegui.
 
                Ora puoi vedere che la funzione è stata creata.
 
                Step 8 - Fare clic con il pulsante destro del mouse sul nome del progetto in Esplora soluzioni e selezionare Aggiungi → Nuovo elemento.
Step 9 - Quindi selezionare ADO.NET Entity Data Model nel riquadro Modelli.
 
                Step 10 - Immettere TVFModel come nome, quindi fare clic su Aggiungi.
Step 11 - Nella finestra di dialogo Scegli contenuto modello, seleziona Progettazione EF dal database, quindi fai clic su Avanti.
 
                Step 12 - Seleziona il tuo database e fai clic su Avanti.
 
                Step 13 - Nella finestra di dialogo Scegli gli oggetti del database selezionare tabelle, viste.
 
                Step 14 - Selezionare la funzione GetStudentGradesForCourse situata nel nodo Stored procedure e funzioni e fare clic su Fine.
Step 15 - Selezionare Visualizza → Altre finestre → Browser modello dati entità e fare clic con il pulsante destro del mouse su GetStudentGradesForCourse in Importazioni di funzioni e selezionare Modifica.
 
                Vedrai la seguente finestra di dialogo.
 
                Step 16 - Fare clic sul pulsante di opzione Entità e selezionare Iscrizione dalla casella combinata come tipo di ritorno di questa funzione e fare clic su Ok.
Diamo un'occhiata al seguente codice C # in cui verranno recuperati tutti i voti degli studenti iscritti al corso ID = 4022 nel database.
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();
      }
   }
}Quando il codice precedente viene compilato ed eseguito, riceverai il seguente output:
Student ID: 1, Grade: 2
Student ID: 4, Grade: 4
Student ID: 9, Grade: 3.5Si consiglia di eseguire l'esempio precedente in modo graduale per una migliore comprensione.