Megosztás a következőn keresztül:


Ú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

  1. 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.

  2. 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).

  3. 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.

  4. 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

Lásd még