Condividi tramite


Procedura: chiamare funzioni definite dal modello nelle query (LINQ to Entities)

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 di alto livello per la chiamata di 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 ulteriori informazioni, vedere How to: Define Custom Functions in the Conceptual Model.

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

Nell'esempio seguente viene mostrato come chiamare una funzione definita nel modello concettuale dall'interno di una query LINQ to Entities . Nell'esempio viene utilizzato il modello School. Per informazioni sull'esempio del modello School, vedere Creazione del database di esempio School (Guida rapida di Entity Framework) e Generazione del file con estensione School.edmx (Guida rapida di Entity Framework).

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 How to: Define Custom Functions in the Conceptual Model.

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

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

<EdmFunction("SchoolModel", "YearsSince")>
Public Function YearsSince(ByVal date1 As DateTime) _
    As Integer
    Throw New NotSupportedException("Direct calls are not supported.")
End Function
[EdmFunction("SchoolModel", "YearsSince")]
public static int YearsSince(DateTime date)
{
    throw new NotSupportedException("Direct calls are not supported.");
}

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 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
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);
    }
}

Vedere anche

Attività

Procedura: chiamare funzioni definite dal modello come metodi di oggetto (LINQ to Entities)

Concetti

Query in LINQ to Entities
Chiamata di funzioni nelle query LINQ to Entities

Altre risorse

.edmx File Overview