Como: Chamar funções definidas por modelo em consultas
Este tópico descreve como chamar funções definidas no modelo conceitual de dentro de consultas LINQ to Entities.
O procedimento abaixo fornece uma estrutura de tópicos de alto nível para chamar uma função definida pelo modelo de dentro de uma consulta LINQ to Entities. O exemplo a seguir fornece mais detalhes sobre as etapas do procedimento. O procedimento pressupõe que você definiu uma função no modelo conceitual. Para obter mais informações, consulte Como definir funções personalizadas no modelo conceitual.
Para chamar uma função definida no modelo conceitual
Adicione um método CLR (Common Language Runtime) ao seu aplicativo que mapeia para a função definida no modelo conceitual. Para mapear o método, você deve aplicar um EdmFunctionAttribute ao método. Observe que os NamespaceName parâmetros e FunctionName 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.
Chame a função em uma consulta LINQ to Entities.
Exemplo 1
O exemplo a seguir demonstra como chamar uma função que é definida no modelo conceitual 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.
A função de modelo conceitual a seguir retorna o número de anos desde que um instrutor foi contratado. Para obter informações sobre como adicionar a função a um modelo conceitual, consulte Como definir funções personalizadas no modelo conceitual.
<Function Name="YearsSince" ReturnType="Edm.Int32">
<Parameter Name="date" Type="Edm.DateTime" />
<DefiningExpression>
Year(CurrentDateTime()) - Year(date)
</DefiningExpression>
</Function>
Exemplo 2
Em seguida, adicione o seguinte método ao seu aplicativo e use um EdmFunctionAttribute para mapeá-lo para a função de modelo conceitual:
[EdmFunction("SchoolModel", "YearsSince")]
public static int YearsSince(DateTime date)
{
throw new NotSupportedException("Direct calls are not supported.");
}
<EdmFunction("SchoolModel", "YearsSince")>
Public Function YearsSince(ByVal date1 As DateTime) _
As Integer
Throw New NotSupportedException("Direct calls are not supported.")
End Function
Exemplo 3
Agora você pode chamar a função de modelo conceitual de dentro de uma consulta LINQ to Entities. O código a seguir chama o método para exibir todos os instrutores que foram contratados há mais de dez anos:
using (SchoolEntities context = new SchoolEntities())
{
// Retrieve instructors hired more than 10 years ago.
var instructors = from p in context.People
where YearsSince((DateTime)p.HireDate) > 10
select p;
foreach (var instructor in instructors)
{
Console.WriteLine(instructor.LastName);
}
}
Using context As New SchoolEntities()
' Retrieve instructors hired more than 10 years ago.
Dim instructors = From p In context.People _
Where YearsSince(CType(p.HireDate, DateTime?)) > 10 _
Select p
For Each instructor In instructors
Console.WriteLine(instructor.LastName)
Next
End Using