Partilhar via


Como: Chamar funções de banco de dados personalizadas

Este tópico descreve como chamar funções personalizadas definidas no banco de dados de dentro de consultas LINQ to Entities.

As funções de banco de dados que são chamadas de consultas LINQ to Entities são executadas no banco de dados. A execução de funções no banco de dados pode melhorar o desempenho do aplicativo.

O procedimento abaixo fornece uma estrutura de tópicos de alto nível para chamar uma função de banco de dados personalizada. O exemplo a seguir fornece mais detalhes sobre as etapas do procedimento.

Para chamar funções personalizadas definidas no banco de dados

  1. Crie uma função personalizada em seu banco de dados.

    Para obter mais informações sobre como criar funções personalizadas no SQL Server, consulte CREATE FUNCTION (Transact-SQL).

  2. Declare uma função na linguagem de definição de esquema de armazenamento (SSDL) do seu arquivo .edmx. O nome da função deve ser o mesmo que o nome da função declarada no banco de dados.

    Para obter mais informações, consulte Elemento de função (SSDL).

  3. Adicione um método correspondente a uma classe no código do aplicativo e aplique um EdmFunctionAttribute ao método Observe que os NamespaceName e FunctionName parâmetros do atributo são o nome do namespace do modelo conceitual e o nome da função no modelo conceitual, respectivamente. A resolução do nome da função para LINQ diferencia maiúsculas de minúsculas.

  4. Chame o método em uma consulta LINQ to Entities.

Exemplo 1

O exemplo a seguir demonstra como chamar uma função de banco de dados personalizada de dentro de uma consulta LINQ to Entities. O exemplo usa o modelo Escola. Para obter informações sobre o modelo Escola, consulte Criando o banco de dados de exemplo da escola e Gerando o arquivo .edmx da escola.

O código a seguir adiciona a AvgStudentGrade função ao banco de dados de exemplo da escola.

Nota

As etapas para chamar uma função de banco de dados personalizada são as mesmas, independentemente do servidor de banco de dados. No entanto, o código abaixo é específico para criar uma função em um banco de dados do SQL Server. O código para criar uma função personalizada em outros servidores de banco de dados pode ser diferente.

USE [School]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE FUNCTION [dbo].[AvgStudentGrade](@studentId INT)
RETURNS DECIMAL(3,2)
AS
    BEGIN
    DECLARE @avg DECIMAL(3,2);
    SELECT @avg = avg(Grade) FROM StudentGrade WHERE StudentID = @studentId;

    RETURN @avg;
END

Exemplo 2

Em seguida, declare uma função na linguagem de definição de esquema de armazenamento (SSDL) do seu arquivo .edmx . O código a seguir declara a AvgStudentGrade função no SSDL:

<Function Name="AvgStudentGrade" ReturnType="decimal" Schema="dbo" >
  <Parameter Name="studentId" Mode="In" Type="int" />
</Function>

Exemplo 3

Agora, crie um método e mapeie-o para a função declarada no SSDL. O método na classe a seguir é mapeado para a função definida no SSDL (acima) usando um EdmFunctionAttributearquivo . Quando esse método é chamado, a função correspondente no banco de dados é executada.

[EdmFunction("SchoolModel.Store", "AvgStudentGrade")]
public static decimal? AvgStudentGrade(int studentId)
{
    throw new NotSupportedException("Direct calls are not supported.");
}
<EdmFunction("SchoolModel.Store", "AvgStudentGrade")>
Public Function AvgStudentGrade(ByVal studentId As Integer) _
    As Nullable(Of Decimal)
    Throw New NotSupportedException("Direct calls are not supported.")
End Function

Exemplo 4

Finalmente, chame o método em uma consulta LINQ to Entities. O código a seguir exibe os sobrenomes e as notas médias dos alunos no console:

using (SchoolEntities context = new SchoolEntities())
{
    var students = from s in context.People
                   where s.EnrollmentDate != null
                   select new
                   {
                       name = s.LastName,
                       avgGrade = AvgStudentGrade(s.PersonID)
                   };

    foreach (var student in students)
    {
        Console.WriteLine("{0}: {1}", student.name, student.avgGrade);
    }
}
Using context As New SchoolEntities()
    Dim students = From s In context.People _
                   Where s.EnrollmentDate IsNot Nothing _
                   Select New With {.name = s.LastName, _
                                   .avgGrade = AvgStudentGrade(s.PersonID)}

    For Each student In students
        Console.WriteLine("{0}: {1}", _
                            student.name, _
                            student.avgGrade)
    Next
End Using

Consulte também