Поделиться через


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

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

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

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

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

  1. Создайте пользовательскую функцию в базе данных.

    Дополнительные сведения о создании пользовательских функций в SQL Server см. в разделе CREATE FUNCTION (Transact-SQL).

  2. Объявите функцию на языке SSDL в EDMX-файле. Имя функции должно совпадать с именем функции, объявленной в базе данных.

    Дополнительные сведения см. в разделе Элемент Function (язык SSDL).

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

  4. Вызовите метод в запросе LINQ to Entities.

Пример

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

Следующий код добавляет функцию AvgStudentGrade в образец базы данных.

Dd456847.note(ru-ru,VS.100).gifПримечание
Шаги вызова пользовательской функции базы данных одинаковы, независимо от сервера базы данных.Однако следующий код предназначен специально для создания функции в базе данных SQL Server.Код для создания пользовательской функции на других серверах баз данных может отличаться.

USE [School]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE FUNCTION [dbo].[AvgStudentGrade](@studentId INT)
RETURNS DECIMAL(3,2)
AS
    BEGIN
    DECLARE @avg DECIMAL(3,2);
    SELECT @avg = avg(Grade) FROM StudentGrade WHERE StudentID = @studentId;

    RETURN @avg;
END

Затем объявите функцию на языке SSDL в EDMX-файле. в следующем коде объявляется функция AvgStudentGrade на языке SSDL:

<Function Name="AvgStudentGrade" ReturnType="decimal" Schema="dbo" >
  <Parameter Name="studentId" Mode="In" Type="int" />
</Function>

Теперь следует создать метод и сопоставить его с функцией, объявленной на языке SSDL. Метод в следующем классе сопоставляется с функцией, определенной на языке SSDL (выше) с помощью EdmFunctionAttribute. При вызове этого метода в базе данных выполняется соответствующая функция.

<EdmFunction("SchoolModel.Store", "AvgStudentGrade")>
Public Function AvgStudentGrade(ByVal studentId As Integer) _
    As Nullable(Of Decimal)
    Throw New NotSupportedException("Direct calls are not supported.")
End Function
[EdmFunction("SchoolModel.Store", "AvgStudentGrade")]
public static decimal? AvgStudentGrade(int studentId)
{
    throw new NotSupportedException("Direct calls are not supported.");
}

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

Using context As New SchoolEntities()
    Dim students = From s In context.People _
        Where s.EnrollmentDate IsNot Nothing _
        Select New With {.name = s.LastName, _
                        .avgGrade = AvgStudentGrade(s.PersonID)}

    For Each student In students
        Console.WriteLine("{0}: {1}", _
                            student.name, _
                            student.avgGrade)
    Next
End Using
using (SchoolEntities context = new SchoolEntities())
{
    var students = from s in context.People
                   where s.EnrollmentDate != null
                   select new
                   {
                       name = s.LastName,
                       avgGrade = AvgStudentGrade(s.PersonID)
                   };

    foreach (var student in students)
    {
        Console.WriteLine("{0}: {1}", student.name, student.avgGrade);
    }
}

См. также

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

Запросы в LINQ to Entities

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

.edmx File Overview