일대 다 관계가있는 관련 컬렉션의 필터가있는 컬렉션에서 선택하는 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 요청 쿼리를 알고 있습니까?
이 쿼리가 올바른 결과 집합을 반환, 그래서 나는 것 대답을 받아 들였지만, 나에게 그것은 해결 방법처럼 보입니다. –