Udostępnij za pośrednictwem


Instrukcje: Wywoływanie niestandardowych funkcji bazy danych

W tym temacie opisano sposób wywoływania funkcji niestandardowych zdefiniowanych w bazie danych z zapytań LINQ to Entities.

W bazie danych są wykonywane funkcje bazy danych wywoływane z zapytań LINQ to Entities. Wykonywanie funkcji w bazie danych może zwiększyć wydajność aplikacji.

Poniższa procedura zawiera ogólny konspekt wywoływania niestandardowej funkcji bazy danych. Poniższy przykład zawiera bardziej szczegółowe informacje na temat kroków opisanych w procedurze.

Aby wywołać funkcje niestandardowe zdefiniowane w bazie danych

  1. Utwórz funkcję niestandardową w bazie danych.

    Aby uzyskać więcej informacji na temat tworzenia funkcji niestandardowych w programie SQL Server, zobacz CREATE FUNCTION (Transact-SQL).

  2. Zadeklaruj funkcję w języku definicji schematu magazynu (SSDL) pliku edmx. Nazwa funkcji musi być taka sama jak nazwa funkcji zadeklarowanej w bazie danych.

    Aby uzyskać więcej informacji, zobacz Function, element (SSDL).

  3. Dodaj odpowiednią metodę do klasy w kodzie aplikacji i zastosuj EdmFunctionAttribute element do metody Zwróć uwagę, że NamespaceName parametry i FunctionName atrybutu są odpowiednio nazwą przestrzeni nazw modelu koncepcyjnego i nazwą funkcji w modelu koncepcyjnym. Rozpoznawanie nazw funkcji dla LINQ uwzględnia wielkość liter.

  4. Wywołaj metodę w zapytaniu LINQ to Entities.

Przykład 1

W poniższym przykładzie pokazano, jak wywołać niestandardową funkcję bazy danych z poziomu zapytania LINQ to Entities. W przykładzie użyto modelu School. Aby uzyskać informacje o modelu szkoły, zobacz Tworzenie przykładowej bazy danych szkoły i Generowanie pliku edmx szkoły.

Poniższy kod dodaje AvgStudentGrade funkcję do przykładowej bazy danych School.

Uwaga

Kroki wywoływania niestandardowej funkcji bazy danych są takie same niezależnie od serwera bazy danych. Poniższy kod jest jednak specyficzny dla tworzenia funkcji w bazie danych programu SQL Server. Kod tworzenia funkcji niestandardowej na innych serwerach baz danych może się różnić.

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

Przykład 2

Następnie zadeklaruj funkcję w języku definicji schematu magazynu (SSDL) pliku edmx . Poniższy kod deklaruje AvgStudentGrade funkcję w programie SSDL:

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

Przykład 3

Teraz utwórz metodę i zamapuj ją na funkcję zadeklarowaną w narzędziu SSDL. Metoda w poniższej klasie jest mapowana na funkcję zdefiniowaną w narzędziu SSDL (powyżej) przy użyciu klasy EdmFunctionAttribute. Po wywołaniu tej metody wykonywana jest odpowiednia funkcja w bazie danych.

[EdmFunction("SchoolModel.Store", "AvgStudentGrade")]
public static decimal? AvgStudentGrade(int studentId)
{
    throw new NotSupportedException("Direct calls are not supported.");
}
<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

Przykład 4

Na koniec wywołaj metodę w zapytaniu LINQ to Entities. Poniższy kod wyświetla nazwiska uczniów i średnie oceny w konsoli:

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

Zobacz też