2014-01-24 131 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

这个查询将返回正确的结果集,所以我已经接受了答案,但对我来说,这看起来像是一个解决方法。 –