Entity Framework - Função com valor de tabela

Neste capítulo, vamos aprender como mapear funções com valor de tabela (TVFs) usando o Entity Framework Designer e como chamar um TVF de uma consulta LINQ.

  • Atualmente, os TVFs são compatíveis apenas com o fluxo de trabalho do Database First.

  • Ele foi introduzido pela primeira vez no Entity Framework versão 5.

  • Para usar os TVFs, você deve direcionar o .NET Framework 4.5 ou superior.

  • É muito semelhante aos procedimentos armazenados, mas com uma diferença fundamental, ou seja, o resultado de um TVF é composível. Isso significa que os resultados de um TVF podem ser usados ​​em uma consulta LINQ, enquanto os resultados de um procedimento armazenado não.

Vamos dar uma olhada no seguinte exemplo de criação de um novo projeto em Arquivo → Novo → Projeto.

Step 1 - Selecione o aplicativo de console no painel do meio e insira TableValuedFunctionDemo no campo de nome.

Step 2 - No explorador de servidores, clique com o botão direito em seu banco de dados.

Step 3 - Selecione Nova Consulta e insira o seguinte código no editor T-SQL para adicionar uma nova tabela em seu banco de dados.

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 - Clique com o botão direito no editor e selecione Executar.

Step 5- Clique com o botão direito em seu banco de dados e clique em atualizar. Você verá a tabela recém-adicionada em seu banco de dados.

Step 6- Agora crie uma função que retornará as notas dos alunos do curso. Insira o código a seguir no 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 - Clique com o botão direito no editor e selecione Executar.

Agora você pode ver que a função foi criada.

Step 8 - Clique com o botão direito no nome do projeto no Solution Explorer e selecione Add → New Item.

Step 9 - Em seguida, selecione ADO.NET Entity Data Model no painel Templates.

Step 10 - Insira TVFModel como nome e clique em Adicionar.

Step 11 - Na caixa de diálogo Choose Model Contents, selecione EF designer do banco de dados e clique em Next.

Step 12 - Selecione seu banco de dados e clique em Avançar.

Step 13 - Na caixa de diálogo Choose Your Database Objects, selecione tabelas, visualizações.

Step 14 - Selecione a função GetStudentGradesForCourse localizada no nó Stored Procedures and Functions e clique em Concluir.

Step 15 - Selecione Exibir → Outras janelas → Navegador de modelo de dados de entidade e clique com o botão direito em GetStudentGradesForCourse em Importações de função e selecione Editar.

Você verá a seguinte caixa de diálogo.

Step 16 - Clique no botão de rádio Entidades e selecione Enrollment na combobox como tipo de retorno desta Função e clique em Ok.

Vamos dar uma olhada no código C # a seguir, no qual todas as notas dos alunos que estão matriculados no ID do curso = 4022 no banco de dados serão recuperadas.

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 o código acima for compilado e executado, você receberá a seguinte saída -

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

Recomendamos que você execute o exemplo acima passo a passo para melhor compreensão.