Procedure: Aangepaste databasefuncties aanroepen
In dit onderwerp wordt beschreven hoe u aangepaste functies aanroept die zijn gedefinieerd in de database vanuit LINQ naar entiteitenquery's.
Databasefuncties die worden aangeroepen van LINQ naar entiteitenquery's, worden uitgevoerd in de database. Het uitvoeren van functies in de database kan de prestaties van toepassingen verbeteren.
De onderstaande procedure biedt een overzicht op hoog niveau voor het aanroepen van een aangepaste databasefunctie. In het volgende voorbeeld vindt u meer informatie over de stappen in de procedure.
Aangepaste functies aanroepen die zijn gedefinieerd in de database
Maak een aangepaste functie in uw database.
Zie CREATE FUNCTION (Transact-SQL) voor meer informatie over het maken van aangepaste functies in SQL Server.
Declareer een functie in de opslagschemadefinitietaal (SSDL) van uw .edmx-bestand. De naam van de functie moet gelijk zijn aan de naam van de functie die in de database is gedeclareerd.
Zie Functie-element (SSDL) voor meer informatie.
Voeg een bijbehorende methode toe aan een klasse in uw toepassingscode en pas een EdmFunctionAttribute toe op de methode. Houd er rekening mee dat de NamespaceName en FunctionName parameters van het kenmerk respectievelijk de naamruimtenaam van het conceptuele model en de functienaam in het conceptuele model zijn. Functienaamomzetting voor LINQ is hoofdlettergevoelig.
Roep de methode in een LINQ aan bij entiteitenquery.
Voorbeeld 1
In het volgende voorbeeld ziet u hoe u een aangepaste databasefunctie aanroept vanuit een LINQ naar entiteitenquery. In het voorbeeld wordt het schoolmodel gebruikt. Zie De schoolvoorbeelddatabase maken en het .edmx-bestand van school genereren voor meer informatie over het schoolmodel.
Met de volgende code wordt de AvgStudentGrade
functie toegevoegd aan de schoolvoorbeelddatabase.
Notitie
De stappen voor het aanroepen van een aangepaste databasefunctie zijn hetzelfde, ongeacht de databaseserver. De onderstaande code is echter specifiek voor het maken van een functie in een SQL Server-database. De code voor het maken van een aangepaste functie op andere databaseservers kan verschillen.
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
Voorbeeld 2
Declareer vervolgens een functie in de opslagschemadefinitietaal (SSDL) van uw .edmx-bestand . De volgende code declareert de AvgStudentGrade
functie in SSDL:
<Function Name="AvgStudentGrade" ReturnType="decimal" Schema="dbo" >
<Parameter Name="studentId" Mode="In" Type="int" />
</Function>
Voorbeeld 3
Maak nu een methode en wijs deze toe aan de functie die in de SSDL is gedeclareerd. De methode in de volgende klasse wordt toegewezen aan de functie die is gedefinieerd in de SSDL (hierboven) met behulp van een EdmFunctionAttribute. Wanneer deze methode wordt aangeroepen, wordt de bijbehorende functie in de database uitgevoerd.
[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
Voorbeeld 4
Roep tot slot de methode in een LINQ aan bij entiteitenquery. In de volgende code worden de achternamen en gemiddelde cijfers van leerlingen/studenten weergegeven in de console:
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