Entity Framework: función con valores de tabla

En este capítulo, aprendamos cómo mapear funciones con valores de tabla (TVF) utilizando Entity Framework Designer y cómo llamar a un TVF desde una consulta LINQ.

  • Actualmente, los TVF solo se admiten en el flujo de trabajo Database First.

  • Se introdujo por primera vez en Entity Framework versión 5.

  • Para utilizar los TVF, debe apuntar a .NET Framework 4.5 o superior.

  • Es muy similar a los procedimientos almacenados pero con una diferencia clave, es decir, el resultado de un TVF es componible. Esto significa que los resultados de un TVF se pueden usar en una consulta LINQ, mientras que los resultados de un procedimiento almacenado no.

Echemos un vistazo al siguiente ejemplo de creación de un nuevo proyecto desde Archivo → Nuevo → Proyecto.

Step 1 - Seleccione la Aplicación de consola en el panel central e ingrese TableValuedFunctionDemo en el campo de nombre.

Step 2 - En el Explorador de servidores, haga clic con el botón derecho en su base de datos.

Step 3 - Seleccione Nueva consulta e ingrese el siguiente código en el editor T-SQL para agregar una nueva tabla en su base de datos.

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 - Haga clic con el botón derecho en el editor y seleccione Ejecutar.

Step 5- Haga clic derecho en su base de datos y haga clic en actualizar. Verá la tabla recién agregada en su base de datos.

Step 6- Ahora cree una función que devolverá las calificaciones de los estudiantes para el curso. Ingrese el siguiente código en el editor T-SQL.

CREATE FUNCTION [dbo].[GetStudentGradesForCourse]

(@CourseID INT)

RETURNS TABLE

RETURN
   SELECT [EnrollmentID],
      [CourseID],
      [StudentID],
      [Grade]
   FROM   [dbo].[StudentGrade]
   WHERE  CourseID = @CourseID

Step 7 - Haga clic con el botón derecho en el editor y seleccione Ejecutar.

Ahora puede ver que se crea la función.

Step 8 - Haga clic derecho en el nombre del proyecto en el Explorador de soluciones y seleccione Agregar → Nuevo elemento.

Step 9 - Luego, seleccione Modelo de datos de entidad ADO.NET en el panel Plantillas.

Step 10 - Ingrese TVFModel como nombre y luego haga clic en Agregar.

Step 11 - En el cuadro de diálogo Elegir contenido del modelo, seleccione Diseñador EF de la base de datos y luego haga clic en Siguiente.

Step 12 - Seleccione su base de datos y haga clic en Siguiente.

Step 13 - En el cuadro de diálogo Choose Your Database Objects, seleccione tablas, vistas.

Step 14 - Seleccione la función GetStudentGradesForCourse ubicada en el nodo Procedimientos y funciones almacenados y haga clic en Finalizar.

Step 15 - Seleccione Ver → Otras ventanas → Explorador de modelos de datos de entidades y haga clic con el botón derecho en GetStudentGradesForCourse en Importaciones de funciones y seleccione Editar.

Verá el siguiente cuadro de diálogo.

Step 16 - Haga clic en el botón de opción Entidades y seleccione Inscripción en el cuadro combinado como tipo de retorno de esta función y haga clic en Aceptar.

Echemos un vistazo al siguiente código C # en el que se recuperarán todas las calificaciones de los estudiantes que estén inscritos en el ID de curso = 4022 en la base de datos.

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();
      }
   }
}

Cuando se compile y ejecute el código anterior, recibirá el siguiente resultado:

Student ID: 1, Grade: 2
Student ID: 4, Grade: 4
Student ID: 9, Grade: 3.5

Le recomendamos que ejecute el ejemplo anterior paso a paso para una mejor comprensión.