Como: Funções de base de dados personalizados de chamada

Este tópico descreve como chamar funções personalizados que são definidas na base de dados de dentro das consultas LINQ to Entities.

Funções de base de dados que são chamadas de consultas LINQ to entidades são executadas em base de dados. Executar funções na base de dados pode melhorar o desempenho do aplicativo.

O procedimento a seguir fornece um contorno de alto nível para chamar uma função de base de dados personalizado. O exemplo a seguir fornece mais detalhes sobre as etapas no procedimento.

Para chamar funções personalizados que são definidas na base de dados

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

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

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

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

  3. Adicione um método correspondente a uma classe em seu código do aplicativo e aplicar EdmFunctionAttribute a nota de método que os parâmetros de NamespaceName e de FunctionName de atributo é o nome do espaço do modelo conceitual e o nome da função no modelo conceitual respectivamente. A resolução de nomes de 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 base de dados personalizado de uma consulta LINQ to Entities. O exemplo usa o modelo de escola. Para obter informações sobre o modelo de escola, consulte Criando o banco de dados de exemplo de escola e gerando o arquivo .edmx da escola.

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

Observação

As etapas para chamar uma função de base de dados personalizado são as mesmas independentemente do servidor de base de dados. No entanto, o código abaixo é específico para criar uma função em uma base de dados SQL Server. O código para criar uma função personalizada em outros servidores de base 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, declarar uma função em linguagem de definição de esquema de armazenamento (SSDL) do arquivo .edmx. O código a seguir declara a função AvgStudentGrade em SSDL:

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

Exemplo 3

Agora crie um método e mapear-lo a função declarada em SSDL. O método na classe é mapeado para a função definida em SSDL (acima) usando EdmFunctionAttribute. Quando esse método é chamado, a função correspondente na base 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 ordens média 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

Confira também