Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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
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).
Zadeklaruj funkcję w języku definicji schematu przechowywania (SSDL) w pliku .edmx. Nazwa funkcji musi być taka sama jak nazwa funkcji zadeklarowanej w bazie danych.
Aby uzyskać więcej informacji, zobacz Function Element (SSDL).
Dodaj odpowiednią metodę do klasy w kodzie aplikacji i zastosuj element EdmFunctionAttribute do tej metody. Zwróć uwagę, że parametr NamespaceName i FunctionName atrybutu to odpowiednio nazwa przestrzeni nazw modelu koncepcyjnego i nazwa funkcji w modelu koncepcyjnym. Rozpoznawanie nazw funkcji dla LINQ jest czułe na wielkość liter.
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 funkcję AvgStudentGrade do szkolnej przykładowej bazy danych.
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 przechowywania (SSDL) pliku .edmx. Poniższy kod deklaruje funkcję AvgStudentGrade w języku 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 do funkcji zdefiniowanej w SSDL (powyżej) przy użyciu elementu 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($"{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ż
- Omówienie pliku edmx
- zapytania w LINQ to Entities