Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Este tópico descreve como chamar funções personalizadas definidas no banco de dados de dentro de consultas LINQ to Entities.
As funções da base de dados que são chamadas pelas 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 visão geral de alto nível para chamar uma função de base 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
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).
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).
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 diferenciação entre maiúsculas e minúsculas é importante na resolução de nomes de funções no LINQ.
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.
Observação
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 EdmFunctionAttribute. 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($"{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