2014-01-24 3 views
0

일대 다 관계가있는 관련 컬렉션의 필터가있는 컬렉션에서 선택하는 OData URL을 작성하려고합니다. 필터는 관련 컬렉션 항목이 모두 일부 속성에 대해 특정 값을 가질 것을 요구합니다.필터와 일치하지 않는 항목을 반환하는 OData 요청

이 문제를 설명하기 위해 Northwind 샘플 OData 서비스에 대한 유사한 URL을 작성했습니다. 이 쿼리는 모든 주문이 동일한 직원에 의해 처리 된 모든 고객을 선택해야합니다. http://services.odata.org/V3/Northwind/Northwind.svc/Customers?$expand=Orders&$filter=Orders/all(o: o/EmployeeID eq 4)&$select=CustomerID,Orders/OrderID,Orders/EmployeeID

이 제공 :

{"odata.metadata":"http://services.odata.org/V3/Northwind/Northwind.svc/$metadata#Customers&$select=CustomerID,Orders/OrderID,Orders/EmployeeID","value": 
[{"Orders":[{"OrderID":10259,"EmployeeID":4}],"CustomerID":"CENTC"} 
,{"Orders":[],"CustomerID":"FISSA"} 
,{"Orders":[],"CustomerID":"PARIS"}]} 

첫 번째 항목이 실제로 모두 갖는다 (이 경우, 단 하나의) 두 번째 및 세 번째없이 주문 항목의 직원 4. 처리 순서는 결과 집합이다. 추가 검사에서 http://services.odata.org/V3/Northwind/Northwind.svc/Customers?$expand=Orders&$filter=(CustomerID eq 'FISSA')&$select=CustomerID,Orders/OrderID,Orders/EmployeeID은 'FISSA'가 실제로 주문을하지 않음을 나타냅니다 (이는 'PARIS'에도 해당됩니다).

'FISSA'에는 아무런 주문도 없었기 때문에 필터 조건에 맞지 않는 술어가 적용될 수 있습니다.

select c.CustomerID 
from Customers c 
where c.CustomerID not in (select CustomerID from Orders o where o.EmployeeID != 4) 

같은 3 개 고객을 반환하지만,이 해결할 Orders 테이블에 가입 :

select c.CustomerID, o.OrderID, o.EmployeeID 
from Customers c 
join Orders o 
on c.CustomerID = o.CustomerID 
where c.CustomerID not in (select CustomerID from Orders o where o.EmployeeID != 4) 

단지 'CENTC를'반환을 사실, 이것은이 쿼리 SQL에서 해결 방법이 될 수 있습니다 .

필자는 필터 술어가 'FISSA'에 대해 결정되지 않았으며 3-value 논리의 규칙에 따라 'FISSA'와 'PARIS'가 결과 집합에 없어야한다고 생각합니다. 그래서, 나는이 OData 구현의 버그라고 생각합니다.

아무도 주문하지 않은 고객을 제외하는 올바른 OData 요청 쿼리를 알고 있습니까?

답변

0

당신이 어떤 널 경기 제거 할 수 있습니다 $ 필터에 하나를 추가 : 주문/어떤? (O : O/직원 ID 네브라스카 널)

http://services.odata.org/V3/Northwind/Northwind.svc/Customers $ = 주문을 확장 & $ 선택 = CustomerID를, 주문/OrderID를 , 주문/직원 ID & $ 필터 = 주문/모든 (O : O/직원 ID EQ 4) 주문/어떤 (O : O/직원 ID 네브라스카 널)

+0

이 쿼리가 올바른 결과 집합을 반환, 그래서 나는 것 대답을 받아 들였지만, 나에게 그것은 해결 방법처럼 보입니다. –

관련 문제