Nota
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare ad accedere o modificare le directory.
L'accesso a questa pagina richiede l'autorizzazione. È possibile provare a modificare le directory.
In questo argomento viene descritto come chiamare funzioni personalizzate definite nel database dall'interno di query LINQ to Entities.
Le funzioni di database chiamate dalle query LINQ to Entities vengono eseguite nel database. L'esecuzione di funzioni nel database può migliorare le prestazioni dell'applicazione.
La procedura seguente fornisce una struttura generale per chiamare una funzione di database personalizzata. Nell'esempio seguente vengono fornite informazioni più dettagliate sui passaggi della procedura.
Per chiamare funzioni personalizzate definite nel database
Creare una funzione personalizzata nel database.
Per altre informazioni sulla creazione di funzioni personalizzate in SQL Server, vedere CREATE FUNCTION (Transact-SQL).
Dichiarare una funzione nel linguaggio di definizione dello schema del modello (SSDL) del file con estensione edmx. Il nome della funzione deve corrispondere al nome della funzione dichiarata nel database.
Per ulteriori informazioni, vedere Elemento Funzione (SSDL).
Aggiungere un metodo corrispondente a una classe nel codice dell'applicazione e applicare un EdmFunctionAttribute al metodo Si noti che i parametri NamespaceName e FunctionName dell'attributo sono rispettivamente il nome dello spazio dei nomi del modello concettuale e il nome della funzione nel modello concettuale. La risoluzione dei nomi di funzione per LINQ fa distinzione tra maiuscole e minuscole.
Chiamare il metodo in una query di LINQ to Entities.
Esempio 1
Nell'esempio seguente viene illustrato come chiamare una funzione di database personalizzata dall'interno di una query LINQ to Entities. Nell'esempio viene usato il modello School. Per informazioni sul modello School, vedere Creare il Database di Esempio della Scuola e Generare il File .edmx della Scuola.
Il codice seguente aggiunge la funzione AvgStudentGrade al database di esempio School.
Nota
I passaggi per chiamare una funzione di database personalizzata sono gli stessi indipendentemente dal server di database. Tuttavia, il codice seguente è specifico per la creazione di una funzione in un database di SQL Server. Il codice per la creazione di una funzione personalizzata in altri server di database potrebbe differire.
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
Esempio 2
Successivamente, dichiarare una funzione nel file SSDL (Store Schema Definition Language) del file .edmx. Il codice seguente dichiara la funzione AvgStudentGrade in SSDL:
<Function Name="AvgStudentGrade" ReturnType="decimal" Schema="dbo" >
<Parameter Name="studentId" Mode="In" Type="int" />
</Function>
Esempio 3
Creare ora un metodo ed eseguirne il mapping alla funzione dichiarata in SSDL. Il metodo nella classe seguente viene mappato alla funzione definita in SSDL (sopra) usando un EdmFunctionAttribute. Quando viene chiamato questo metodo, viene eseguita la funzione corrispondente nel database.
[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
Esempio 4
Infine, chiamare il metodo in una query LINQ to Entities. Nel codice seguente vengono visualizzati i nomi e i voti medi degli studenti nella 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($"{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