개체 쿼리(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 작업의 기본 제한 시간은 기본 연결 공급자에 정의됩니다. 그러나 다음 예제에서와 같이 ObjectContext의 CommandTimeout 속성을 사용하여 이 기본 제한 시간 값을 재정의할 수 있습니다.
' 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로 개체 검색
엔터티의 키 값을 아는 경우 명시적으로 개체 쿼리를 만들어 실행하지 않고 데이터 소스에서 해당 개체를 검색할 수 있습니다. ObjectContext의 GetObjectByKey 및 TryGetObjectByKey 메서드에서는 지정된 EntityKey를 가진 개체를 개체 컨텍스트로 반환합니다. GetObjectByKey를 사용하는 경우 제공된 EntityKey가 기존 엔터티와 일치하지 않으면 ObjectNotFoundException을 처리해야 합니다. 자세한 내용은 방법: 개체 키를 사용하여 특정 개체 반환(Entity Framework)을 참조하십시오.