Как вызывать определяемые моделью функции в запросах (LINQ to Entities)
В этом разделе описаны процедуры вызова функций, определенные в концептуальной модели, из запросов LINQ to Entities .
Приведенная ниже процедура обеспечивает высокоуровневую структуру для вызова функции, определяемой моделью, из запроса LINQ to Entities . В следующем примере подробно описаны шаги данной процедуры. Для этой процедуры предполагается, что функция была определена в концептуальной модели. Дополнительные сведения см. в разделе How to: Define Custom Functions in the Conceptual Model.
Вызов функции, определенной в концептуальной модели
Добавьте в приложение метод среды CLR, который сопоставляется с функцией, определенной в концептуальной модели. Для сопоставления метода к нему необходимо применить атрибут EdmFunctionAttribute. Обратите внимание, что параметры атрибута NamespaceName и FunctionName представляют имя пространства имен концептуальной модели и имя функции концептуальной модели соответственно. При разрешении имени функции для LINQ учитывается регистр.
Вызовите функцию в запросе 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