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
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.
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