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

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

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

Zobacz też