Compartilhar via


Funções com Valor de Tabela (TVFs)

Observação

Apenas a partir do EF5 : os recursos, as APIs etc. discutidos nessa página foram introduzidos no Entity Framework 5. Se você estiver usando uma versão anterior, algumas ou todas as informações não se aplicarão.

O vídeo e passo a passo mostram como mapear funções com valor de tabela (TVFs) usando o Entity Framework Designer. Ele também demonstra como chamar uma TVF a partir de uma consulta LINQ.

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

O suporte a TVF foi introduzido na versão 5 do Entity Framework. Observe que, para usar os novos recursos, como funções com valor de tabela, enumerações e tipos espaciais, você deve usar o .NET Framework 4.5. O Visual Studio 2012 tem como destino o .NET 4.5 por padrão.

As TVFs são muito semelhantes aos procedimentos armazenados, com uma diferença fundamental: o resultado de uma TVF pode ser composto. Isso significa que os resultados de uma TVF podem ser usados em uma consulta LINQ, enquanto os resultados de um procedimento armazenado não podem.

Assista ao vídeo

Apresentado por: Julia Kornich

WMV | MP4 | WMV (ZIP)

Pré-Requisitos

Para concluir este passo a passo, você precisa de:

Configurar o Projeto

  1. Abra o Visual Studio
  2. No menu Arquivo, apontar para Novo e clicar em Projeto
  3. No painel esquerdo, clicar em Visual C#e selecionar o modelo Console
  4. Inserir TVF como o nome do projeto e clicar em OK

Adicionar uma TVF ao Banco de dados

  • Selecionar Exibir -> Pesquisador de Objetos do SQL Server
  • Se o LocalDB não estiver na lista de servidores: clique com o botão direito do mouse em SQL Server e selecione Adicionar SQL Server Use a Autenticação do Windows padrão para se conectar ao servidor LocalDB
  • Expandir o nó de LocalDB
  • No nó Bancos de dados, clique com o botão direito do mouse no nó Banco de dados Escola e selecione Nova Consulta…
  • No Editor de T-SQL, cole a seguinte definição de TVF
CREATE FUNCTION [dbo].[GetStudentGradesForCourse]

(@CourseID INT)

RETURNS TABLE

RETURN
    SELECT [EnrollmentID],
           [CourseID],
           [StudentID],
           [Grade]
    FROM   [dbo].[StudentGrade]
    WHERE  CourseID = @CourseID
  • Clique com o botão direito do mouse no Editor de T-SQL e selecione Executar
  • A função GetStudentGradesForCourse foi adicionada ao Banco de dados Escola

 

Criar um modelo

  1. No Gerenciador de Soluções, clique com o botão direito do mouse no projeto, aponte para Adicionar e selecione Novo Item
  2. Selecione Dados no menu à esquerda e depois selecione Modelo de Dados de Entidade ADO.NET no painel Modelos
  3. Insira TVFModel.edmx para o nome do arquivo e clique em Adicionar
  4. Na caixa de diálogo Escolher Conteúdos do Modelo, selecione Gerar a partir do banco de dados e depois clique em Avançar
  5. Clique em Nova Conexão, digite (localdb)\mssqllocaldb e na caixa de texto do Nome do servidor, digite School como o nome do banco de dados e clique em OK
  6. Na caixa de diálogo Escolher seus objetos de banco de dados no nóTabelas, selecione as tabelas Person, StudentGrade e Course
  7. Selecione a função GetStudentGradesForCourse localizada no nó Procedimentos Armazenados e Funções e observe que, a partir do Visual Studio 2012, o Entity Designer permite que você importe em lote seus Procedimentos Armazenados e Funções
  8. Clique em Concluir
  9. O Entity Designer, que fornece uma superfície de design para editar seu modelo, é exibido. Todos os objetos selecionados na caixa de diálogo Escolher Seus Objetos de Banco de Dados são adicionados ao modelo.
  10. Por padrão, a forma de resultado de cada procedimento ou função armazenada importada se tornará automaticamente um novo tipo complexo em seu modelo de entidade. Mas queremos mapear os resultados da função GetStudentGradesForCourse para a entidade StudentGrade: clique com o botão direito do mouse na superfície de design e selecione Navegador de Modelos. No Navegador de Modelos, selecione Importações de Funçõese depois clique duas vezes na função GetStudentGradesForCourse na caixa de diálogo Editar Importação de Função, selecione Entidades e escolha StudentGrade

Persistência e Recuperação de Dados

Abra o arquivo onde o método Main está definido. Adicione o seguinte código à função Main.

O código a seguir demonstra como compilar uma consulta que usa uma função com valor de tabela. A consulta projeta os resultados em um tipo anônimo que contém o título do Curso relacionado e alunos relacionados com uma nota maior ou igual a 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 e execute o aplicativo. O programa produz a seguinte saída:

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

Resumo

Neste passo a passo, vimos como mapear Funções com Valor de Tabela (TVFs) usando o Entity Framework Designer. Ele também demonstrou como chamar uma TVF a partir de uma consulta LINQ.