Практическое руководство. Вызов определяемых моделью функций в запросах

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

Приведенная ниже процедура содержит высокоуровневую структуру для вызова определяемой моделью функции из запроса LINQ to Entities. В следующем примере подробно описаны шаги данной процедуры. Для этой процедуры предполагается, что функция была определена в концептуальной модели. Дополнительные сведения см. в разделе "Практическое руководство. Определение пользовательских функций в концептуальной модели".

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

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

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

Пример 1

В следующем примере показано, как вызвать функцию, определенную в концептуальной модели, из запроса LINQ to Entities. В этом примере используется модель School. Сведения о модели school см. в разделе "Создание учебной образца базы данных " и создание файла edmx для школы.

В следующей концептуальной модели функция возвращает сведения о количестве лет, истекших с момента приема инструктора на работу. Сведения о добавлении функции в концептуальную модель см. в разделе "Практическое руководство. Определение пользовательских функций в концептуальной модели".

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

Пример 2

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

[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

Пример 3

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

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

См. также