Postupy: Volání modelem definovaných funkcí v dotazech

Toto téma popisuje, jak volat funkce definované v konceptuálním modelu z dotazů LINQ to Entities.

Následující postup poskytuje základní přehled volání modelem definované funkce z dotazu LINQ to Entities. Následující příklad obsahuje podrobnější informace o krocích v postupu. Tento postup předpokládá, že jste definovali funkci v konceptuálním modelu. Další informace naleznete v tématu Postupy: Definování vlastních funkcí v konceptuálním modelu.

Volání funkce definované v konceptuálním modelu

  1. Přidejte do aplikace metodu CLR (Common Language Runtime), která se mapuje na funkci definovanou v koncepčním modelu. Chcete-li namapovat metodu, musíte u této metody použít EdmFunctionAttribute metodu. Všimněte si, že NamespaceName parametry FunctionName atributu jsou názvem oboru názvů konceptuálního modelu a názvem funkce v konceptuálním modelu. Rozlišení názvů funkcí pro LINQ rozlišují malá a velká písmena.

  2. Volání funkce v dotazu LINQ to Entities

Příklad 1

Následující příklad ukazuje, jak volat funkci, která je definována v koncepčním modelu z dotazu LINQ to Entities. V příkladu se používá školní model. Informace o školním modelu naleznete v tématu Vytvoření ukázkové databáze školy a generování souboru School .edmx.

Následující koncepční funkce modelu vrátí počet let od přijetí instruktora. Informace o přidání funkce do konceptuálního modelu najdete v tématu Postupy: Definování vlastních funkcí v konceptuálním modelu.

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

Příklad 2

Dále do aplikace přidejte následující metodu a použijte EdmFunctionAttribute ji k namapování na koncepční funkci modelu:

[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

Příklad 3

Teď můžete volat koncepční funkci modelu z dotazu LINQ to Entities. Následující kód volá metodu k zobrazení všech instruktorů, kteří byli přijati před více než deset let:

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

Viz také