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.