Procedura: Chiamare funzioni definite dal modello in query

In questo argomento viene descritto come chiamare funzioni definite nel modello concettuale dall'interno di query LINQ to Entities.

La procedura descritta di seguito fornisce una struttura generica per chiamare una funzione definita dal modello dall'interno di una query LINQ to Entities. Nell'esempio che segue vengono forniti dettagli aggiuntivi sui passaggi della procedura. In questa procedura si presuppone che sia stata definita una funzione nel modello concettuale. Per altre informazioni, vedere Procedura: Definire funzioni personalizzate nel modello concettuale.

Per chiamare una funzione definita nel modello concettuale

  1. Aggiungere un metodo CLR (Common Language Runtime) all'applicazione che esegue il mapping alla funzione definita nel modello concettuale. Per eseguire il mapping del metodo, è necessario applicare un oggetto EdmFunctionAttribute al metodo. Si noti che i parametri NamespaceName e FunctionName dell'attributo sono rispettivamente il nome dello spazio dei nomi del modello concettuale e il nome della funzione nel modello concettuale. La risoluzione del nome della funzione per LINQ rileva la distinzione tra maiuscole e minuscole.

  2. Chiamare la funzione in una query LINQ to Entities.

Esempio 1

Nell'esempio seguente viene mostrato come chiamare una funzione definita nel modello concettuale dall'interno di una query LINQ to Entities. Nell'esempio viene usato il modello School. Per informazioni sul modello School, vedere Creazione del database di esempio School e Generazione del file School con estensione edmx.

La funzione del modello concettuale seguente restituisce il numero di anni di servizio di un docente. Per informazioni sull'aggiunta della funzione a un modello concettuale, vedere Procedura: Definire funzioni personalizzate nel modello concettuale.

<Function Name="YearsSince" ReturnType="Edm.Int32">
  <Parameter Name="date" Type="Edm.DateTime" />
  <DefiningExpression>
    Year(CurrentDateTime()) - Year(date)
  </DefiningExpression>
</Function>

Esempio 2

Successivamente aggiungere il metodo seguente all'applicazione e usare un oggetto EdmFunctionAttribute per eseguirne il mapping alla funzione del modello concettuale:

[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

Esempio 3

A questo punto è possibile chiamare la funzione del modello concettuale dall'interno di una query LINQ to Entities. Nel codice seguente viene chiamato il metodo per visualizzare tutti i docenti assunti da più di dieci anni:

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

Vedi anche