Funciones con valores de tabla (TVF)

Nota:

Solo EF5 y versiones posteriores: las características, las API, etc. que se tratan en esta página se introdujeron en Entity Framework 5. Si usa una versión anterior, no se aplica parte o la totalidad de la información.

El vídeo y el tutorial paso a paso muestran cómo asignar funciones con valores de tabla (TVF) mediante Entity Framework Designer. También muestran cómo llamar a una TVF desde una consulta LINQ.

Las TVF solo se admiten actualmente en el flujo de trabajo Database First.

Code First se introdujo con Entity Framework 5. Tenga en cuenta que para usar las nuevas características, como funciones con valores de tabla, enumeraciones y tipos espaciales, debe usar .NET Framework 4.5. Visual Studio 2012 usa .NET 4.5 de forma predeterminada.

Las TVF son muy similares a los procedimientos almacenados con una diferencia clave: el resultado de una TVF admite composición. Esto significa que se pueden usar en una consulta LINQ mientras que los resultados de un procedimiento almacenado no.

Ver el vídeo

Presentado por: Julia Kornich

WMV | MP4 | WMV (ZIP)

Requisitos previos

Para completar este tutorial, debe hacer lo siguiente:

Configuración del proyecto

  1. Abra Visual Studio.
  2. En el menú Archivo, seleccione Nuevo y, luego, haga clic en Proyecto.
  3. En el panel izquierdo, haga clic en Visual C# y, luego, seleccione la plantilla Consola.
  4. Escriba TVF como nombre del proyecto y haga clic en Aceptar.

Agregar una TVF a la base de datos

  • Seleccione Ver -> Explorador de objetos de SQL Server.
  • Si LocalDB no está en la lista de servidores, haga clic con el botón derecho en SQL Server y seleccione Agregar SQL Server Usar la autenticación de Windows predeterminada para conectarse al servidor LocalDB.
  • Expanda el nodo LocalDB
  • En el nodo Bases de datos, haga clic con el botón derecho en el nodo de base de datos School y seleccione Nueva consulta….
  • En el editor de T-SQL, pegue la siguiente definición de TVF.
CREATE FUNCTION [dbo].[GetStudentGradesForCourse]

(@CourseID INT)

RETURNS TABLE

RETURN
    SELECT [EnrollmentID],
           [CourseID],
           [StudentID],
           [Grade]
    FROM   [dbo].[StudentGrade]
    WHERE  CourseID = @CourseID
  • Haga clic en el botón derecho del mouse en el editor de T-SQL y seleccione Ejecutar.
  • La función GetStudentGradesForCourse se agrega a la base de datos School.

 

Creación de un modelo

  1. En el Explorador de soluciones, haga clic con el botón derecho en el nombre del proyecto, seleccione Agregar y, luego, haga clic en Nuevo elemento.
  2. Seleccione Datos en el menú izquierdo y, luego, elija ADO.NET Entity Data Model en el panel Plantillas.
  3. Escriba TVFModel.edmx como nombre de archivo y, luego, haga clic en Agregar.
  4. En el cuadro de diálogo "Elegir contenido del modelo", seleccione Generar desde la base de datos y, luego, haga clic en Siguiente.
  5. Haga clic en Nueva conexión, escriba (localdb)\mssqllocaldb en el cuadro de texto "Nombre del servidor", escriba School como nombre de la base de datos y haga clic en Aceptar.
  6. En el cuadro de diálogo "Elegir los objetos de base de datos", en el nodo Tablas, seleccione las tablas Person, StudentGrade y Course.
  7. Seleccione la función GetStudentGradesForCourse ubicada en el nodo Procedimientos almacenados y funciones. Tenga en cuenta que a partir de Visual Studio 2012, Entity Designer le permite importar por lotes los procedimientos almacenados y las funciones.
  8. Haga clic en Finish (Finalizar).
  9. Se muestra Entity Designer, que proporciona una superficie de diseño para modificar el modelo. Todos los objetos seleccionados en el cuadro de diálogo Elegir los objetos de base de datos se agregan al modelo.
  10. De forma predeterminada, la forma del resultado de cada procedimiento almacenado o función importados se convertirá automáticamente en un nuevo tipo complejo en el modelo de entidad. Pero queremos asignar los resultados de la función GetStudentGradesForCourse a la entidad StudentGrade. Haga clic con el botón derecho en la superficie de diseño y seleccione Explorador de modelos. En el explorador de modelos, seleccione Importaciones de funcionesy, luego, haga doble clic en la función GetStudentGradesForCourse. En el cuadro de diálogo "Editar importación de funciones", seleccione Entidades y elija StudentGrade.

Conservar y recuperar datos

Abra el archivo donde se define el método Main. Agregue el código siguiente a la función Main.

En el código siguiente se muestra cómo crear una consulta que use una función con valores de tabla. La consulta proyecta los resultados en un tipo anónimo que contiene el título del curso relacionado y los alumnos relacionados con una calificación mayor o igual que 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);
    }
}

Compile y ejecute la aplicación. El programa produce el siguiente resultado:

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

Resumen

El vídeo y el tutorial paso a paso muestran cómo asignar funciones con valores de tabla (TVF) mediante Entity Framework Designer. También muestran cómo llamar a una TVF desde una consulta LINQ.