Útmutató: Egyéni adatbázisfüggvények meghívása
Ez a témakör azt ismerteti, hogyan hívhatja meg az adatbázisban definiált egyéni függvényeket a LINQ-ból az Entitások lekérdezésekbe.
A LINQ-ból az Entitások lekérdezésekbe hívott adatbázisfüggvények végrehajtása az adatbázisban történik. Az adatbázisban lévő függvények végrehajtása javíthatja az alkalmazás teljesítményét.
Az alábbi eljárás egy magas szintű vázlatot biztosít egy egyéni adatbázisfüggvény meghívásához. Az alábbi példa részletesebben ismerteti az eljárás lépéseit.
Az adatbázisban definiált egyéni függvények meghívása
Hozzon létre egy egyéni függvényt az adatbázisban.
Az egyéni függvények SQL Serverben való létrehozásáról további információt a CREATE FÜGGVÉNY (Transact-SQL) című témakörben talál.
Deklaráljon egy függvényt az .edmx fájl tárolósémadefiníciós nyelvében (SSDL). A függvény nevének meg kell egyeznie az adatbázisban deklarált függvény nevével.
További információ: Függvényelem (SSDL).
Adjon hozzá egy megfelelő metódust egy osztályhoz az alkalmazáskódban, és alkalmazza EdmFunctionAttribute a metódust Vegye figyelembe, hogy az NamespaceName attribútum és FunctionName paraméterei a fogalmi modell névtérneve, a függvény neve pedig a fogalmi modellben. A LINQ függvénynévfeloldás megkülönbözteti a kis- és nagybetűk nevét.
A LINQ metódusának meghívása Entitások lekérdezésre.
1. példa
Az alábbi példa bemutatja, hogyan hívhat meg egyéni adatbázisfüggvényeket egy LINQ-ból Entitások lekérdezésbe. A példa az Iskola modellt használja. Az iskolai modellről további információt az Iskolai mintaadatbázis létrehozása és az Iskola .edmx fájl létrehozása című témakörben talál.
Az alábbi kód hozzáadja a AvgStudentGrade
függvényt az Iskolai mintaadatbázishoz.
Feljegyzés
Az egyéni adatbázisfüggvények meghívásának lépései az adatbázis-kiszolgálótól függetlenül ugyanazok. Az alábbi kód azonban egy függvény SQL Server-adatbázisban való létrehozására vonatkozik. Az egyéni függvények más adatbázis-kiszolgálókon való létrehozására szolgáló kód eltérhet.
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
2. példa
Ezután deklaráljon egy függvényt az .edmx fájl tárolósémadefiníciós nyelvében (SSDL). A következő kód deklarálja a függvényt az AvgStudentGrade
SSDL-ben:
<Function Name="AvgStudentGrade" ReturnType="decimal" Schema="dbo" >
<Parameter Name="studentId" Mode="In" Type="int" />
</Function>
3. példa
Most hozzon létre egy metódust, és rendelje hozzá az SSDL-ben deklarált függvényhez. A következő osztály metódusa az SSDL-ben (fent) definiált függvényhez van leképezve egy EdmFunctionAttribute. A metódus meghívásakor a rendszer végrehajtja az adatbázis megfelelő függvényét.
[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
4. példa
Végül hívja meg a LINQ metódusát az Entitások lekérdezéshez. Az alábbi kód a diákok vezetékneveit és átlagos osztályzatait jeleníti meg a konzolon:
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