我想组合一个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请求查询以排除无订单的客户?
这个查询将返回正确的结果集,所以我已经接受了答案,但对我来说,这看起来像是一个解决方法。 –