Instrukcje: wywoływanie funkcji zdefiniowanych przez model w zapytaniach
W tym temacie opisano sposób wywoływania funkcji zdefiniowanych w modelu koncepcyjnym z zapytań LINQ to Entities.
Poniższa procedura zawiera ogólny konspekt wywoływania funkcji zdefiniowanej przez model z poziomu zapytania LINQ to Entities. Poniższy przykład zawiera bardziej szczegółowe informacje na temat kroków opisanych w procedurze. Procedura zakłada, że zdefiniowano funkcję w modelu koncepcyjnym. Aby uzyskać więcej informacji, zobacz How to: Define Custom Functions in the Conceptual Model (Jak definiować funkcje niestandardowe w modelu koncepcyjnym).
Aby wywołać funkcję zdefiniowaną w modelu koncepcyjnym
Dodaj metodę środowiska uruchomieniowego języka wspólnego (CLR) do aplikacji, która mapuje na funkcję zdefiniowaną w modelu koncepcyjnym. Aby zamapować metodę, należy zastosować metodę EdmFunctionAttribute . Należy pamiętać, że NamespaceName parametry i FunctionName atrybutu są odpowiednio nazwą przestrzeni nazw modelu koncepcyjnego i nazwą funkcji w modelu koncepcyjnym. Rozpoznawanie nazw funkcji dla LINQ uwzględnia wielkość liter.
Wywołaj funkcję w zapytaniu LINQ to Entities.
Przykład 1
W poniższym przykładzie pokazano, jak wywołać funkcję zdefiniowaną w modelu koncepcyjnym z poziomu zapytania LINQ to Entities. W przykładzie użyto modelu School. Aby uzyskać informacje o modelu szkoły, zobacz Tworzenie przykładowej bazy danych szkoły i Generowanie pliku edmx szkoły.
Następująca funkcja modelu koncepcyjnego zwraca liczbę lat od czasu zatrudnienia instruktora. Aby uzyskać informacje na temat dodawania funkcji do modelu koncepcyjnego, zobacz How to: Define Custom Functions in the Conceptual Model (Instrukcje: definiowanie funkcji niestandardowych w modelu koncepcyjnym).
<Function Name="YearsSince" ReturnType="Edm.Int32">
<Parameter Name="date" Type="Edm.DateTime" />
<DefiningExpression>
Year(CurrentDateTime()) - Year(date)
</DefiningExpression>
</Function>
Przykład 2
Następnie dodaj następującą metodę do aplikacji i użyj EdmFunctionAttribute elementu , aby zamapować ją na funkcję modelu koncepcyjnego:
[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
Przykład 3
Teraz możesz wywołać funkcję modelu koncepcyjnego z poziomu zapytania LINQ to Entities. Poniższy kod wywołuje metodę , aby wyświetlić wszystkich instruktorów, którzy zostali zatrudnieni ponad dziesięć lat temu:
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