다음을 통해 공유


쿼리 프로젝션(WCF Data Services)

프로젝션은 엔터티의 특정 속성만 응답에서 반환되도록 지정하여 쿼리에서 반환되는 피드의 데이터의 양을 줄이는 메커니즘을 Open Data Protocol(OData) 에서 제공합니다. 자세한 내용은 OData를 참조하십시오.

이 항목에서는 쿼리 프로젝션을 정의하는 방법, 엔터티 및 비 엔터티 형식에 대한 요구 사항, 프로젝션된 결과 업데이트 및 프로젝션된 형식 만들기에 대해 설명하고 몇 가지 프로젝션 고려 사항을 제시합니다.

쿼리 프로젝션 정의

URI에서 $select 쿼리 옵션을 사용하거나 LINQ 쿼리에서 select 절(Visual Basic에서는 Select)을 사용하여 프로젝션 절을 쿼리에 추가할 수 있습니다. 반환된 엔터티 데이터는 클라이언트에서 엔터티 형식이나 비 엔터티 형식으로 프로젝션될 수 있습니다. 이 항목의 예제에서는 LINQ 쿼리에서 select 절을 사용하는 방법을 보여 줍니다.

Ee473425.Important(ko-kr,VS.100).gif 참고:
프로젝션된 형식을 업데이트한 내용을 저장할 때 데이터 서비스에서 데이터가 손실될 수 있습니다.자세한 내용은 Projection Considerations을 참조하십시오.

엔터티 및 비 엔터티 형식에 대한 요구 사항

엔터티 형식에는 엔터티 키를 구성하는 하나 이상의 ID 속성이 있어야 합니다. 엔터티 형식은 클라이언트에서 다음 중 한 가지 방법으로 정의됩니다.

기본적으로 쿼리 결과를 클라이언트에서 정의된 형식으로 프로젝션하는 경우 프로젝션에서 요청된 속성이 클라이언트 형식에 있어야 합니다. 그러나 DataServiceContextIgnoreMissingProperties 속성에 true 값을 지정하는 경우에는 프로젝션에 지정된 속성이 클라이언트 형식에 있을 필요가 없습니다.

프로젝션된 결과 업데이트

쿼리 결과를 클라이언트에서 엔터티 형식으로 프로젝션하는 경우 DataServiceContextSaveChanges 메서드를 호출할 때 데이터 서비스로 다시 전송되는 업데이트를 통해 이러한 개체를 추적할 수 있습니다. 그러나 클라이언트에서 비 엔터티 형식으로 프로젝션된 데이터를 업데이트한 내용은 데이터 서비스로 다시 전송될 수 없습니다. 이는 엔터티 인스턴스를 식별하는 키가 없는 경우 데이터 서비스가 데이터 소스에서 올바른 엔터티를 업데이트할 수 없기 때문입니다. 비 엔터티 형식은 DataServiceContext에 연결되지 않습니다.

데이터 서비스에 정의된 엔터티 형식의 속성 중 하나 이상이 엔터티가 프로젝션되는 클라이언트 형식에 없는 경우 새 엔터티를 삽입할 때 이러한 없는 속성이 포함되지 않습니다. 이 경우 기존 엔터티를 업데이트한 내용 또한 이러한 없는 속성을 포함하지 않습니다. 이러한 속성의 값이 있는 경우 업데이트를 수행하면 속성의 값이 데이터 소스에 정의된 속성의 기본값으로 다시 설정됩니다.

프로젝션된 형식 만들기

다음 예제에서는 Customers 형식의 주소 관련 속성을 새 CustomerAddress 형식으로 프로젝션하는 익명 LINQ 쿼리를 사용합니다. 새 형식은 클라이언트에서 정의되며 엔터티 형식으로 특성이 지정됩니다.

' Define an anonymous LINQ query that projects the Customers type into 
' a CustomerAddress type that contains only address properties.
Dim query = From c In context.Customers _
                Where c.Country = "Germany" _
                Select New CustomerAddress With { _
                    .CustomerID = c.CustomerID, _
                    .Address = c.Address, _
                    .City = c.City, _
                    .Region = c.Region, _
                    .PostalCode = c.PostalCode, _
                    .Country = c.Country}
// Define an anonymous LINQ query that projects the Customers type into 
// a CustomerAddress type that contains only address properties.
var query = from c in context.Customers
            where c.Country == "Germany"
            select new CustomerAddress { 
                CustomerID = c.CustomerID, 
                Address = c.Address, 
                City = c.City, 
                Region = c.Region,
                PostalCode = c.PostalCode, 
                Country = c.Country};

이 예제에서 개체 이니셜라이저 패턴은 생성자를 호출하는 대신 CustmerAddress 형식의 새 인스턴스를 만드는 데 사용됩니다. 생성자는 엔터티 형식으로 프로젝션할 때 지원되지 않지만 비 엔터티 및 익명 형식으로 프로젝션할 때 사용할 수 있습니다. CustomerAddress가 엔터티 형식이기 때문에 변경 후 데이터 서비스로 다시 전송될 수 있습니다.

또한 Customer 형식의 데이터가 익명 형식 대신 CustomerAddress 엔터티 형식의 인스턴스로 프로젝션됩니다. 익명 형식으로 프로젝션할 수 있지만 익명 형식이 비 엔터티 형식으로 처리되기 때문에 데이터가 읽기 전용입니다.

DataServiceContextMergeOption 설정은 쿼리 프로젝션 중에 ID 확인에 사용됩니다. 이는 Customer 형식의 인스턴스가 이미 DataServiceContext에 있는 경우 ID가 동일한 CustomerAddress의 인스턴스가 MergeOption에 의해 설정된 ID 확인 규칙을 따름을 의미합니다.

다음 표에서는 결과를 엔터티 및 비 엔터티 형식으로 프로젝션하는 경우의 동작에 대해 설명합니다.

동작 엔터티 형식 비 엔터티 형식

다음 예제와 같이 이니셜라이저를 사용하여 프로젝션된 새 인스턴스 만들기

Dim query = From c In context.Customers _
                Where c.Country = "Germany" _
                Select New CustomerAddress With { _
                    .CustomerID = c.CustomerID, _
                    .Address = c.Address, _
                    .City = c.City, _
                    .Region = c.Region, _
                    .PostalCode = c.PostalCode, _
                    .Country = c.Country}
var query = from c in context.Customers
            where c.Country == "Germany"
            select new CustomerAddress { 
                CustomerID = c.CustomerID, 
                Address = c.Address, 
                City = c.City, 
                Region = c.Region,
                PostalCode = c.PostalCode, 
                Country = c.Country};

지원됨

지원됨

다음 예제와 같이 생성자를 사용하여 프로젝션된 새 인스턴스 만들기

Dim query = From c In context.Customers _
                Where c.Country = "Germany" _
                Select New CustomerAddress( _
                c.CustomerID, _
                c.Address, _
                c.City, _
                c.Region, _
                c.PostalCode, _
                c.Country)
var query = from c in context.Customers
            where c.Country == "Germany"
            select new CustomerAddress(
            c.CustomerID, 
            c.Address, 
            c.City, 
            c.Region,
            c.PostalCode, 
            c.Country);

NotSupportedException이 발생함

지원됨

다음 예제와 같이 프로젝션을 사용하여 속성 값 변환

Dim query = From c In context.Customers _
                Where c.Country = "Germany" _
                Select New CustomerAddress With _
                {.CustomerID = c.CustomerID, _
                    .Address = "Full address: " & c.Address & ", " & _
                    c.City & "," & c.Region & " " & c.PostalCode, _
                    .City = c.City, _
                    .Region = c.Region, _
                    .PostalCode = c.PostalCode, _
                    .Country = c.Country}
var query = from c in context.Customers
            where c.Country == "Germany"
            select new CustomerAddress
            {
                CustomerID = c.CustomerID, 
                Address = "Full address:" + c.Address + ", " +
                c.City + ", " + c.Region + " " + c.PostalCode,
                City = c.City,
                Region = c.Region,
                PostalCode = c.PostalCode,
                Country = c.Country
            };

이 변환은 혼동을 일으킬 수 있고 다른 엔터티에 속한 데이터 소스의 데이터를 덮어쓸 가능성이 있으므로 엔터티 형식에는 지원되지 않습니다.

NotSupportedException이 발생함

지원됨

프로젝션 고려 사항

쿼리 프로젝션을 정의할 때 다음 사항을 추가로 고려해야 합니다.

  • Atom 형식에 대한 사용자 지정 피드를 정의하는 경우 사용자 지정 매핑이 정의되어 있는 모든 엔터티 속성이 프로젝션에 포함되도록 해야 합니다. 매핑된 엔터티 속성이 프로젝션에 포함되지 않는 경우 데이터가 손실될 수 있습니다. 자세한 내용은 피드 사용자 지정(WCF Data Services)을 참조하십시오.

  • 데이터 서비스의 데이터 모델에서 엔터티의 모든 속성을 포함하지 않는 프로젝션된 형식에 삽입이 수행되는 경우 클라이언트에서 프로젝션에 포함되지 않은 속성이 기본값으로 설정됩니다.

  • 데이터 서비스의 데이터 모델에서 엔터티의 모든 속성을 포함하지 않는 프로젝션된 형식을 업데이트하는 경우 클라이언트에서 프로젝션에 포함되지 않은 기존 값이 초기화되지 않은 기본값으로 덮어쓰입니다.

  • 프로젝션에 복합 속성이 포함된 경우 전체 복합 개체가 반환되어야 합니다.

  • 프로젝션에 탐색 속성이 포함된 경우 Expand 메서드를 호출하지 않고도 관련 개체가 암시적으로 로드됩니다. Expand 메서드는 프로젝션된 쿼리에서 사용할 수 없습니다.

  • 클라이언트의 쿼리 프로젝션 쿼리는 요청 URI에서 $select 쿼리 옵션을 사용하도록 변환됩니다. 프로젝션을 사용하는 쿼리가 $select 쿼리 옵션을 지원하지 않는 이전 버전의 WCF Data Services 에 대해 실행되는 경우 오류가 반환됩니다. 이러한 문제는 데이터 서비스에 대한 DataServiceBehaviorMaxProtocolVersionV1 값으로 설정된 경우에도 발생할 수 있습니다. 자세한 내용은 여러 버전의 WCF Data Services 작업을 참조하십시오.

자세한 내용은 방법: 쿼리 결과 프로젝션(WCF Data Services)을 참조하십시오.

참고 항목

개념

데이터 서비스 쿼리(WCF Data Services)