방법: 사용자 지정 데이터베이스 함수 호출(LINQ to Entities)
이 항목에서는 LINQ to Entities 쿼리 내에서 데이터베이스에 정의된 사용자 지정 함수를 호출하는 방법에 대해 설명합니다.
LINQ to Entities 쿼리에서 호출된 데이터베이스 함수는 데이터베이스에서 실행됩니다. 데이터베이스에서 함수를 실행하면 응용 프로그램 성능이 향상될 수 있습니다.
다음 절차에서는 사용자 지정 데이터베이스 함수를 호출하는 방법에 대해 간단히 설명합니다. 절차 다음에 나오는 예제에서는 절차의 단계를 보다 자세히 설명합니다.
데이터베이스에 정의되어 있는 사용자 지정 함수를 호출하려면
데이터베이스에서 사용자 지정 함수를 만듭니다.
SQL Server에서 사용자 지정 함수를 만드는 방법은 CREATE FUNCTION(Transact-SQL)을 참조하십시오.
.edmx 파일의 SSDL(저장소 스키마 정의 언어)에서 함수를 선언합니다. 함수의 이름은 데이터베이스에 선언된 함수의 이름과 같아야 합니다.
자세한 내용은 Function 요소(SSDL)를 참조하십시오.
해당되는 메서드를 응용 프로그램 코드의 클래스에 추가하고 EdmFunctionAttribute를 메서드에 적용합니다. 특성의 NamespaceName 매개 변수는 개념적 모델의 네임스페이스 이름이고, 특성의 FunctionName 매개 변수는 개념적 모델의 함수 이름입니다. LINQ에 대한 함수 이름 확인은 대/소문자를 구분합니다.
LINQ to Entities 쿼리에서 메서드를 호출합니다.
예제
다음 예제에서는 LINQ to Entities 쿼리 내에서 사용자 지정 데이터베이스 함수를 호출하는 방법에 대해 설명합니다. 이 예제에서는 School 모델을 사용합니다. School 모델에 대한 자세한 내용은 School 샘플 데이터베이스 만들기(Entity Framework 퀵 스타트) 및 School .edmx 파일 생성(Entity Framework 퀵 스타트)을 참조하십시오.
다음 코드에서는 AvgStudentGrade
함수를 School 샘플 데이터베이스에 추가합니다.
참고: |
---|
사용자 지정 데이터베이스 함수를 호출하는 단계는 데이터베이스 서버에 상관없이 동일합니다.그러나 아래의 코드는 SQL Server 데이터베이스에서 함수를 만드는 작업과 관련된 것입니다.다른 데이터베이스 서버에서 사용자 지정 함수를 만드는 작업에 대한 코드는 다를 수 있습니다. |
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
다음으로 .edmx 파일의 SSDL(저장소 스키마 정의 언어)에서 함수를 선언합니다. 다음 코드에서는 SSDL에서 AvgStudentGrade
함수를 선언합니다.
<Function Name="AvgStudentGrade" ReturnType="decimal" Schema="dbo" >
<Parameter Name="studentId" Mode="In" Type="int" />
</Function>
이제 메서드를 만들고 해당 메서드를 SSDL에서 선언된 함수로 매핑합니다. EdmFunctionAttribute를 사용하여 다음 클래스의 메서드가 위의 SSDL에서 정의된 함수로 매핑됩니다. 이 메서드가 호출되면 데이터베이스에 있는 해당되는 함수가 실행됩니다.
<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
[EdmFunction("SchoolModel.Store", "AvgStudentGrade")]
public static decimal? AvgStudentGrade(int studentId)
{
throw new NotSupportedException("Direct calls are not supported.");
}
마지막으로 LINQ to Entities 쿼리에서 메서드를 호출합니다. 다음 코드에서는 학생의 성 및 평균 학점을 콘솔에 표시합니다.
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
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);
}
}