Como chamar funções definidas por modelo em consultas

Este tópico descreve como chamar funções que são definidas no modelo conceitual de dentro das consultas de LINQ to Entities.

O procedimento a seguir fornece um contorno de alto nível para chamar uma função do definida em uma consulta de LINQ to Entities. O exemplo a seguir fornece mais detalhes sobre as etapas no procedimento. O procedimento presume 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

  1. Adicione um método do Common Language Runtime (CLR) ao seu aplicativo que mapeia função definida no modelo conceitual. Para mapear o método, você deve aplicar EdmFunctionAttribute para o método. Observe 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.

  2. 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 uma consulta de 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.

A função a seguir o modelo conceitual retorna o número de anos como um instrutor foi contratado. Para obter informações sobre como adicionar a função a um modelo conceitual, confira 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 usa EdmFunctionAttribute para mapear-lo à 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 do modelo conceitual de uma consulta de LINQ to Entities. O código a seguir chama o método para exibir todos os instrutores que foram contratados mais de dez anos há:

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

Confira também