2013-05-13 2 views
1

"Registrations"라는 연결된 테이블이있는 "Events"테이블이 있으며 이벤트 테이블의 레코드와 등록 수를 반환하는 OData 서비스를 만들고 싶습니다. 각 이벤트. 데이터는 JavaScript에서 클라이언트 측에서 사용되므로 리턴 된 데이터의 크기를 줄이고 모든 링크 된 등록 레코드를 완전히 포함하지 않으려합니다. 예를 들어OData 결과에 연결된 레코드 수 포함

:

ID Title  Date   Regs 
1 Breakfast 01.01.01 12:00 4 
2 Party  01.01.01 20:00 20 

나는 ASP.NET MVC4과 서비스를 짓고 있어요. 테이블은 MSSQL 데이터베이스에 있습니다. 나는 OData와 LINQ로 시작하고있다.

먼저 WebAPI OData 시스템을 사용하여 (EntitySetController 클래스 사용) 시도했지만 엔티티 집합에 Registrations 테이블을 포함하자마자 암호화 된 서버 오류가 발생했습니다. ("복잡한 유형의 'Models.Registration'은 'Event'속성을 통해 'Models.Event'엔터티 유형을 참조합니다.)

WCF OData 시스템을 구축하는 데 성공했으며 이벤트 정보 및 정보를 요청할 수있었습니다. 관련 등록.

그러나 이벤트 결과 집합에 집계 정보를 포함시키는 방법에 대한 단서가 없습니다. OData 서비스의 원본이 될 사용자 지정 엔터티 집합을 만들어야합니까? 나는 해결책을 찾기 위해 여기에 너무 적은 정보를 포함 시켰을 것이지만, 나는 어디를 봐야할지 정말로 모른다. 누군가 나를 도울 수 있습니까? 당신이 Event 당 추가 요청을하고자하는 경우 (당신은 또한 Registration 기관에의 링크를 사용하는 경우 또는 http://.../YourService.svc/Events(<key>)/$links/Registrations?$inlinecount=allpages)

답변

0

나는 결국 매우 간단했다. 등록 수를 포함하여 테이블을 반환하는 SQL Server에서 뷰를 만들었습니다. 내가 중 하나로, OData v4를 사용하고

2

, 당신은 http://.../YourService.svc/Events(<key>)/Registrations/$count를 조회 할 수 있습니다.

공공 서비스에 대한 이러한 접근 방법 모두의

예 :

http://services.odata.org/V3/OData/OData.svc/Suppliers(0)/Products/$count

http://services.odata.org/V3/OData/OData.svc/Suppliers(0)/$links/Products?$inlinecount=allpages&$format=json

난 당신이 Events의 나머지 부분과 함께 번들로 제공하기 위해이 정보를 선호하는 것 같은데요 응답 비록. 그것은 이상적인 건 아니지만, 당신은이 라인을 따라 쿼리를 실행할 수 있습니다 :

http://services.odata.org/V3/OData/OData.svc/Suppliers?$format=json&$expand=Products&$select=Products/ID,*

내가 (당신의 Registrations 유사) Products을 확대하고있는 배열을 포함하는 응답을 강제하기 위해 Products/ID을 선택하고 있습니다를 중첩 된 Products 컬렉션과 동일한 크기입니다. 나는 신경 쓰지 않는다 ID - 나는 방금 작은 데이터를 선택했다. 이 JSON 응답을 사용하면 자바 클라이언트는 Products 배열의 길이를 가져 와서 Products의 번호로 사용하여 주어진 Supplier에 연결합니다.

(참고 : config.DataServiceBehavior.AcceptProjectionRequests = true; : 당신이 서비스를 초기화 할 때 WCF 데이터 서비스를 사용 $select 쿼리,이 라인을 포함해야합니다 서비스 지원을 위해) 추가

편집 : 접근 방식을 $ 사용하여 확장 $ 서버가 서버 구동 페이징을 수행하는 경우 select가 올바른 카운트를 보장하지 않습니다. 일반적으로 OData v3에서 요구하는 작업을 수행하는 간단한 단일 응답 방법은 없지만 OData v4에서는 새로운 expand/select 구문을 사용하여 가능합니다.

+0

고마워요! 나는 직장에서 돌아올 때 화요일에이 두 접근법을 시도 할 것입니다. 그들은 아주 좋은 해결책처럼 보입니다. – Peter

0

이벤트 모델을 편집하고 RegistrationCount 속성을 추가 할 수 있습니까? 그게 내가 생각하는 가장 단순한 방법이 될거야.

+0

내가 할 수 있겠지만 등록 표에서 집계 된 수를 어떻게 채울 지 모르겠다 ... – Peter

0

... 내가 전에 그들을 사용한 적이 있기 때문에, 뷰를 사용하는 방법에 대해 생각하지 그리고 난이 구문을 사용하지 마십시오 : 필드가 [email protected]라고

var url = '.../odata/clients?$expand=Orders($count=true)'; 
// ... 

을 올바른 수를 포함하는 응답 엔터티에이 추가되었습니다. 이 도움이

var ordersCount = response.value['[email protected]']; 

희망 : 지금은 다음과 같이 그것을 할 당신이 대시를 포함하는 JSON 속성에 액세스 할 수 있습니다.

관련 문제