다음을 통해 공유


방법: 사용자 지정 데이터베이스 함수 호출

이 항목에서는 LINQ to Entities 쿼리 내에서 데이터베이스에 정의된 사용자 지정 함수를 호출하는 방법을 설명합니다.

LINQ에서 엔터티 쿼리로 호출되는 데이터베이스 함수는 데이터베이스에서 실행됩니다. 데이터베이스에서 함수를 실행하면 애플리케이션 성능이 향상될 수 있습니다.

아래 절차에서는 사용자 지정 데이터베이스 함수를 호출하기 위한 개략적인 개요를 제공합니다. 다음 예제에서는 프로시저의 단계에 대해 자세히 설명합니다.

데이터베이스에 정의된 사용자 지정 함수를 호출하려면

  1. 데이터베이스에서 사용자 지정 함수를 만듭니다.

    SQL Server에서 사용자 지정 함수를 만드는 방법에 대한 자세한 내용은 CREATE FUNCTION(Transact-SQL)을 참조하세요.

  2. .edmx 파일의 SSDL(저장소 스키마 정의 언어)에서 함수를 선언합니다. 함수의 이름은 데이터베이스에 선언된 함수의 이름과 동일해야 합니다.

    자세한 내용은 Function 요소(SSDL)를 참조하세요.

  3. 애플리케이션 코드의 클래스에 해당 메서드를 추가하고 EdmFunctionAttribute을(를) 메서드에 적용합니다. 특성의 NamespaceNameFunctionName 매개변수는 각각 개념 모델의 네임스페이스 이름과 개념 모델의 함수 이름입니다. LINQ의 함수 이름 확인은 대/소문자를 구분합니다.

  4. LINQ to Entities 쿼리에서 메서드를 호출합니다.

예제 1

다음 예제에서는 LINQ to Entities 쿼리 내에서 사용자 지정 데이터베이스 함수를 호출하는 방법을 보여 줍니다. 이 예제에서는 School 모델을 사용합니다. 학교 모델에 대한 자세한 내용은 학교 샘플 데이터베이스 만들기School .edmx 파일 생성을 참조하세요.

다음 코드는 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

예제 2

다음으로. .edmx 파일의 SSDL(저장소 스키마 정의 언어)에서 함수를 선언합니다. 다음 코드는 SSDL에서 함수를 AvgStudentGrade 선언합니다.

<Function Name="AvgStudentGrade" ReturnType="decimal" Schema="dbo" >
  <Parameter Name="studentId" Mode="In" Type="int" />
</Function>

예제 3

이제 메서드를 만들고 SSDL에 선언된 함수에 매핑합니다. 다음 클래스의 메서드는 EdmFunctionAttribute을 사용하여 위의 SSDL에 정의된 함수에 매핑됩니다. 이 메서드가 호출되면 데이터베이스의 해당 함수가 실행됩니다.

[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

마지막으로 LINQ to Entities 쿼리에서 메서드를 호출합니다. 다음 코드는 학생의 성 및 평균 성적을 콘솔에 표시합니다.

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

참고하십시오