Как вызывать определяемые моделью функции в запросах (LINQ to Entities)

В этом разделе описаны процедуры вызова функций, определенные в концептуальной модели, из запросов LINQ to Entities .

Приведенная ниже процедура обеспечивает высокоуровневую структуру для вызова функции, определяемой моделью, из запроса LINQ to Entities . В следующем примере подробно описаны шаги данной процедуры. Для этой процедуры предполагается, что функция была определена в концептуальной модели. Дополнительные сведения см. в разделе How to: Define Custom Functions in the Conceptual Model.

Вызов функции, определенной в концептуальной модели

  1. Добавьте в приложение метод среды CLR, который сопоставляется с функцией, определенной в концептуальной модели. Для сопоставления метода к нему необходимо применить атрибут EdmFunctionAttribute. Обратите внимание, что параметры атрибута NamespaceName и FunctionName представляют имя пространства имен концептуальной модели и имя функции концептуальной модели соответственно. При разрешении имени функции для LINQ учитывается регистр.

  2. Вызовите функцию в запросе LINQ to Entities .

Пример

В следующем примере показано, как вызвать функцию, определенную в концептуальной модели, из запроса LINQ to Entities . В этом примере используется модель School. Дополнительные сведения о модели School см. в разделах Создание образца базы данных School (краткое руководство по Entity Framework) и Создание EDMX-файла School (краткое руководство по платформе Entity Framework).

В следующей концептуальной модели функция возвращает сведения о количестве лет, истекших с момента приема инструктора на работу. (Сведения о добавлении функции к концептуальной модели см. в разделе 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>

Затем добавьте в приложение следующий метод и с помощью атрибута EdmFunctionAttribute сопоставьте его с функцией концептуальной модели:

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

Теперь можно вызвать функцию концептуальной модели из запроса LINQ to Entities . Следующий код вызывает метод, чтобы отобразить всех инструкторов, которые были приняты на работу более десяти лет назад:

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

См. также

Задачи

Как вызывать функции, определяемые в модели, в качестве методов объекта (язык LINQ to Entities).

Основные понятия

Запросы в LINQ to Entities
Вызов функций в запросах LINQ to Entities

Другие ресурсы

.edmx File Overview