2014-01-24 133 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'沒有任何命令違反過濾謂詞,謂詞成立。事實上,這可能是該查詢在SQL解決方法:

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

返回相同的3個客戶,但在訂單表連接將解決這個問題:

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」 。

我認爲過濾器謂詞對於'FISSA'是不確定的,並且遵循三值邏輯的規則,'FISSA'和'PARIS'不應該在結果集中。所以,我認爲這是這個OData實現中的一個錯誤。

有沒有人知道正確的OData請求查詢以排除無訂單的客戶?

回答

0

添加任何的$過濾器可以去除任何空的匹配:訂單/否?(O:O /僱員NE空)

http://services.odata.org/V3/Northwind/Northwind.svc/Customers $擴大=訂單& $選擇=客戶ID,訂單/訂單ID ,訂單/僱員& $過濾器=訂單/所有(○: O /僱員EQ 4)和訂單/任何(O:O /僱員NE空)

+0

這個查詢將返回正確的結果集,所以我已經接受了答案,但對我來說,這看起來像是一個解決方法。 –