2013-05-30 2 views
1

을 반환 나는 지금 내 WebApi의 하나로, OData 컨트롤러에서 나는 모든 제품 공급 업체에 반환 할 간단한 데이터 모델은 두 개의 엔티티 WebApi 중 하나로, OData는 복합 형

public class product 
{ 
    public int ID {get;set;} 
    public string Name {get;set;} 
} 

public class supplier 
{ 
    public int ID {get;set;} 
    public string Name {get;set;} 
    public IEnumerable<product> products {get;set;} 
} 

로 구성된 있습니다. 그러나 나는 단지 서글러를 반환하고 효과적으로 제품 정보를 제거하는 것으로이 일을 할 수없는 것 같습니다. 컨트롤러 메서드는 간단한 Get 및 GetEntityByKey입니다. 구성은 다음과 같습니다.

ODataModelBuilder modelBuilder = new ODataConventionModelBuilder(); 
      modelBuilder.EntitySet<supplier>("supplier"); 
      modelBuilder.EntitySet<product>("product"); 

구성 옵션이 있습니까?

답변

1

공급자 엔티티를 얻으려는 URI를 언급하지 않았지만 다음과 같이 가정합니다. http://.../ServiceRoot.svc/supplier(1). OData에서 기본적으로 탐색 속성은 확장되지 않습니다. 즉, 기본적으로 $expand 쿼리 옵션을 통해 명시 적으로 요청하지 않으면 공급 업체에 요청하면 링크 된 제품의 ID와 이름이 포함되지 않습니다. 예 : http://.../ServiceRoot.svc/supplier(1)?$expand=products.

탐색 속성을 확장하지 않으면 공급자의 products 속성이 제품 엔터티에 대한 링크 모음으로 표시됩니다. 응답 페이로드에있는 제품에 대한 링크가 표시되지 않으면 새로운 O3Data 형식 인 JSON 형식을 사용하고 있기 때문일 수 있습니다.이 형식은 일반적인 OData URI 규칙을 따르는 탐색 링크를 생략 할 수 있습니다 (클라이언트가 링크 자체).

돌아 오는 요청 URI와 페이로드를 포함하면 상황에 따라 조금 더 명확해질 수 있습니다.

용어에 대한 간단한 설명 : OData의 "복합 유형"은 일반적으로 신원이없는 구조 유형을 나타냅니다. 이것의 전형적인 예는 여러 가지 구성 요소 (도시, 국가, 거리 등)가 있지만 자신의 키를 가질 필요가없는 값 유형 인 Address 유형 일 수 있습니다. 여기서 말하는 것은 엔티티 간의 탐색입니다.

+0

Jen의 답변을 토대로 $ expand는 NuGet의 Web API OData의 첫 번째 릴리스에서 지원되지 않지만 현재 야간 빌드에서 사용할 수 있으며 다음 릴리스에서 사용할 수 있어야합니다. 나이트 클럽에 액세스하는 방법에 대한 자세한 내용은 다음 블로그 게시물을 참조하십시오. http://blogs.msdn.com/b/henrikn/archive/2012/06/01/using-nightly-asp-net-web-stack- nuget-packages-with-vs-2012-rc.aspx –

+0

다시 연락해 주셔서 감사합니다. 최소한 나는 구성 옵션과 odata 자체가 아닌 추가 odata WebApi Get에서 리턴 된 Json에 포함하기보다는 추가 '제품'정보를 제거한다는 것을 알고 있습니다. 다음 버전의 출시일이 있습니까? –

+0

@YoussefMoussaoui 야간 빌드를 얻었지만 간단한 예제가 작동하지 않습니다. 참고로 필라델피아 작곡가 http : // mywebsite : port/odata/suppler (1)? $ expand = products를 사용하고 있습니다. webapi 컨트롤러의 코드는 다음과 같습니다. protected override supplier GetEntityByKey (int key) { supplier s = new supplier() {Name = "Test", ID = 1}; s.products = new List () {신제품() {ID = 1, Name = "P1"}, 신제품() {Name = "P2", ID = 2}}; return s; } ' –

0

QueryableAttribute를 사용해보십시오. 여기 봐 :

Expand support

2) $ QueryableAttribute을 통해 하나의 엔티티에 확장을 선택하고 $ 지원.