개체 쿼리(Entity Framework)

ObjectQuery 제네릭 클래스는 0개 이상의 형식화된 엔터티 개체로 구성된 컬렉션을 반환하는 쿼리를 나타냅니다. 개체 쿼리는 항상 기존 개체 컨텍스트에 속합니다. 이 컨텍스트는 쿼리를 작성하고 실행하는 데 필요한 연결 및 메타데이터 정보를 제공합니다. 형식화된 ObjectContext에는 형식화된 ObjectQuery 인스턴스를 반환하는 속성 집합이 포함됩니다. 모델의 각 엔터티 형식에 대해 이러한 속성 중 하나가 있습니다. 이러한 속성을 사용하면 형식화된 ObjectQuery 인스턴스를 보다 쉽게 만들 수 있습니다. 개체 쿼리는 다음 시나리오에서 실행됩니다.

  • foreach(C#) 또는 For Each(Visual Basic) 열거 작업 등이 수행된 경우

  • List 컬렉션을 채우기 위해 할당된 경우

  • Execute 메서드를 명시적으로 호출한 경우

  • First, Any 등의 LINQ 쿼리 실행 연산자를 호출한 경우. 자세한 내용은 쿼리 작성기 메서드(Entity Framework)를 참조하십시오.

다음 쿼리에서는 전달된 매개 변수에 지정된 첫 번째 이름과 마지막 이름을 포함하는 Contact 개체를 반환합니다.

' Get the contacts with the specified name.
Dim contactQuery As ObjectQuery(Of Contact) = _
    context.Contact _
    .Where("it.LastName = @ln AND it.FirstName = @fn", _
    New ObjectParameter("ln", lastName), _
    New ObjectParameter("fn", firstName))
// Get the contacts with the specified name.
ObjectQuery<Contact> contactQuery = context.Contact
    .Where("it.LastName = @ln AND it.FirstName = @fn",
    new ObjectParameter("ln", lastName), 
    new ObjectParameter("fn", firstName));

개체 컨텍스트를 사용하여 쿼리를 작성하고 실행하는 방법에 대한 전체 예제는 방법: 엔터티 형식을 반환하는 쿼리 실행(Entity Framework)을 참조하십시오. Entity SQL 쿼리에 대한 자세한 내용은 Entity SQL 언어를 참조하십시오.

쿼리 프로젝션

개체 쿼리는 EDM(엔터티 데이터 모델) 데이터를 엔터티 개체로 반환하는 데 사용하지만 또한 엔터티 형식으로 쉽게 구체화할 수 없는 데이터를 반환하는 프로젝션도 지원합니다. ObjectQuery는 중첩된 결과 또는 익명 형식이 될 수 있는 비엔터티 형식을 반환하는 프로젝션에 대해 DbDataRecord 형식을 사용합니다. Int32, String 등의 단순 형식은 단일 속성 값을 반환하는 프로젝션과 함께 사용됩니다.

Select 쿼리 작성기 메서드는 실행되었을 때 DbDataRecord 개체의 컬렉션을 반환하는 ObjectQuery를 반환합니다. LINQ to Entities 및 Entity SQL 모두 쿼리 프로젝션을 지원합니다. 쿼리 프로젝션의 예제는 다음 항목을 참조하십시오.

쿼리 프로젝션과 관련하여 다음 사항을 고려해야 합니다.

  • 칼라 결과의 컬렉션이 아닌 단일 스칼라 결과를 나타내도록 ObjectQuery를 초기화할 수 있습니다. 몇몇 확장 메서드는 입력으로 컬렉션 결과를 필요로 합니다. 이러한 경우, 이러한 메서드 중 하나를 호출하면 다음 예제에서와 같이 ArgumentException이 throw됩니다.

    ' Define a query projection that returns 
    ' a single scalar value rather than a collection.
    Dim scalarQuery As ObjectQuery(Of Int32) = _
        New ObjectQuery(Of Int32)("100", advWorksContext)
    
    ' Calling an extension method that requires a collection
    ' will result in an exception.
    Dim hasValues As Boolean = scalarQuery.Any()
    
    // Define a query projection that returns 
    // a single scalar value rather than a collection.
    ObjectQuery<Int32> scalarQuery = 
        new ObjectQuery<Int32>("100", advWorksContext);
    
    // Calling an extension method that requires a collection
    // will result in an exception.
    bool hasValues = scalarQuery.Any(); 
    
  • ObjectQuery를 기본 형식으로 프로젝션했을 때 null 값이 반환되는 경우, null을 허용하는 버전의 형식을 사용해야 합니다. SalesOrderHeader 개체의 ShipDate 속성이 null 값을 반환할 수 있으므로 다음 쿼리에서는 null을 허용하는 DateTime을 사용합니다.

    Dim shipDateQuery As ObjectQuery(Of Nullable(Of Date)) = _
    advWorksContext.SalesOrderHeader _
        .Where("it.CustomerID = @contactId", _
            New ObjectParameter("contactId", contactId)) _
        .SelectValue(Of Nullable(Of Date))("it.ShipDate")
    
    ObjectQuery<Nullable<DateTime>> shipDateQuery =
        advWorksContext.SalesOrderHeader
        .Where("it.CustomerID = @contactId",
            new ObjectParameter("contactId", contactId))
        .SelectValue<Nullable<DateTime>>("it.ShipDate");
    

    자세한 내용은 Nullable 형식(Visual Basic 프로그래밍 가이드) 또는 nullable 형식(C# 프로그래밍 가이드)을 참조하십시오.

명령 제한 시간 설정

개체 쿼리 및 SaveChanges 작업의 기본 제한 시간은 기본 연결 공급자에 정의됩니다. 그러나 다음 예제에서와 같이 ObjectContextCommandTimeout 속성을 사용하여 이 기본 제한 시간 값을 재정의할 수 있습니다.

' Specify a timeout for queries in this context, in seconds.
context.CommandTimeout = 120
// Specify a timeout for queries in this context, in seconds.
context.CommandTimeout = 120;

쿼리가 복잡하거나 다른 성능 문제로 인해 쿼리 또는 SaveChanges 호출의 제한 시간이 자주 초과될 때 사용하십시오.

저장소 명령 보기

EDM을 쿼리할 때, 엔터티 프레임워크에서는 EDM 기반의 LINQ to Entities 및 Entity SQL 쿼리를 데이터 소스에 대한 동일한 쿼리로 변환합니다. 개체 서비스에서는 ToTraceString 메서드를 제공하므로 데이터 소스에 대해 추적을 실행할 필요 없이 런타임에 ObjectQuery에 대한 이러한 저장소 명령을 볼 수 있습니다. EntityClient 공급자도 EntityCommand에서 ToTraceString 메서드를 제공합니다. 자세한 내용은 방법: 저장소 명령 보기(Entity Framework)를 참조하십시오.

EntityKey로 개체 검색

엔터티의 키 값을 아는 경우 명시적으로 개체 쿼리를 만들어 실행하지 않고 데이터 소스에서 해당 개체를 검색할 수 있습니다. ObjectContextGetObjectByKeyTryGetObjectByKey 메서드에서는 지정된 EntityKey를 가진 개체를 개체 컨텍스트로 반환합니다. GetObjectByKey를 사용하는 경우 제공된 EntityKey가 기존 엔터티와 일치하지 않으면 ObjectNotFoundException을 처리해야 합니다. 자세한 내용은 방법: 개체 키를 사용하여 특정 개체 반환(Entity Framework)을 참조하십시오.

참고 항목

개념

데이터를 개체로 쿼리(Entity Framework)