oData WCF数据服务过滤子集合

时间:2013-06-06 12:18:52

标签: wcf rest wcf-data-services odata

我有一系列客户,每个客户都有一系列订单。

以下查询返回客户及其订单并按预期工作:

~Customers?$expand=Orders

现在我想获得现有客户,但是按Order.Amount>过滤他们的订单100(我很高兴没有此类订单的客户留在列表中),

当我尝试以下内容时:

~Customers?$expand=Orders&$filter=Orders/Amount gt 100

我收到以下错误:

The 'Amount' is not allowed at position ***. Member access or specifying a type identifier on a resource set reference is not allowed.

我可以遍历客户并致电

~Customers('Blah')/Orders?$filter=Amount gt 100 

有效,但我真的很想一次完成它。

你能就我如何做到这一点提出建议吗?

1 个答案:

答案 0 :(得分:13)

这里有两件事会引起问题。首先,听起来您想要过滤Orders集合,而不是过滤集合(即,您总是希望返回所有客户,但您只希望扩展某些订单)。当您的URI看起来像EntitySet?$filter=<some predicate>时,过滤器始终适用于EntitySet,在您的情况下为Customers(这不是您想要的)。

其次,~Customers?$expand=Orders&$filter=Orders/Amount gt 100甚至没有正确过滤客户的原因是因为Orders是实体的集合,而不是单个实体。如果您将Orders视为列表,Orders/Amount没有意义,只有Order/Amount才有。如果您希望过滤器仅返回至少有一个订单Order/Amount大于100的客户,则可以使用any关键字:

~Customers?$expand=Orders&$filter=Orders/any(o: o/Amount ge 100)

但是,再次过滤客户,而不是订单。

鉴于您希望实际过滤订单,以下哪项适用于您?

~Orders?$expand=Customer&$filter=Amount gt 100