다음을 통해 공유


방법: 쿼리에서 모델 정의 함수 호출

이 항목에서는 LINQ to Entities 쿼리 내에서 개념적 모델에 정의된 함수를 호출하는 방법에 대해 설명합니다.

다음 절차에서는 LINQ to Entities 쿼리 내에서 모델에 정의된 함수를 호출하는 방법에 대해 간단히 설명합니다. 절차 다음에 나오는 예제에서는 절차의 단계를 보다 자세히 설명합니다. 이 절차에서는 사용자가 개념적 모델에서 함수를 정의했다고 가정합니다. 자세한 내용은 방법: 개념적 모델에서 사용자 지정 함수 정의를 참조하세요.

개념적 모델에 정의된 함수를 호출하려면

  1. 개념적 모델에 정의된 함수로 매핑되는 CLR(공용 언어 런타임) 메서드를 애플리케이션에 추가합니다. 메서드를 매핑하려면 메서드에 EdmFunctionAttribute를 적용해야 합니다. 특성의 NamespaceNameFunctionName 매개 변수는 각각 개념적 모델의 네임스페이스 이름과 함수 이름입니다. LINQ에서 함수 이름을 확인할 때는 대/소문자가 구분됩니다.

  2. LINQ to Entities 쿼리에서 함수를 호출합니다.

예 1

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

다음의 개념적 모델 함수는 강사가 고용된 이후 경과된 년 수를 반환합니다. 개념적 모델에 함수를 추가하는 방법에 대한 자세한 내용은 방법: 개념적 모델에서 사용자 지정 함수 정의를 참조하세요.

<Function Name="YearsSince" ReturnType="Edm.Int32">
  <Parameter Name="date" Type="Edm.DateTime" />
  <DefiningExpression>
    Year(CurrentDateTime()) - Year(date)
  </DefiningExpression>
</Function>

예제 2

다음에는 애플리케이션에 아래 메서드를 추가하고 EdmFunctionAttribute를 사용하여 이 메서드를 개념적 모델 함수에 매핑합니다.

[EdmFunction("SchoolModel", "YearsSince")]
public static int YearsSince(DateTime date)
{
    throw new NotSupportedException("Direct calls are not supported.");
}
<EdmFunction("SchoolModel", "YearsSince")>
Public Function YearsSince(ByVal date1 As DateTime) _
    As Integer
    Throw New NotSupportedException("Direct calls are not supported.")
End Function

예 3

이제 LINQ to Entities 쿼리 내에서 개념적 모델 함수를 호출할 수 있습니다. 다음 코드에서는 고용된 지 10년이 넘은 모든 강사를 표시하는 메서드를 호출합니다.

using (SchoolEntities context = new SchoolEntities())
{
    // Retrieve instructors hired more than 10 years ago.
    var instructors = from p in context.People
                      where YearsSince((DateTime)p.HireDate) > 10
                      select p;

    foreach (var instructor in instructors)
    {
        Console.WriteLine(instructor.LastName);
    }
}
Using context As New SchoolEntities()
    ' Retrieve instructors hired more than 10 years ago.
    Dim instructors = From p In context.People _
                      Where YearsSince(CType(p.HireDate, DateTime?)) > 10 _
                      Select p

    For Each instructor In instructors
        Console.WriteLine(instructor.LastName)
    Next
End Using

참고 항목