oData WCF数据服务过滤子集合

use*_*042 3 rest wcf wcf-data-services odata

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

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

~Customers?$expand=Orders
Run Code Online (Sandbox Code Playgroud)

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

当我尝试以下内容时:

~Customers?$expand=Orders&$filter=Orders/Amount gt 100
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

The 'Amount' is not allowed at position ***. Member access or specifying a type identifier on a resource set reference is not allowed.
Run Code Online (Sandbox Code Playgroud)

我可以遍历客户并致电

~Customers('Blah')/Orders?$filter=Amount gt 100 
Run Code Online (Sandbox Code Playgroud)

哪个有效,但我真的很想一气呵成.

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

Jen*_*n S 13

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

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

~Customers?$expand=Orders&$filter=Orders/any(o: o/Amount ge 100)
Run Code Online (Sandbox Code Playgroud)

但同样,这会过滤客户,而不是订单.

鉴于您想要实际过滤订单,以下是否适合您?

~Orders?$expand=Customer&$filter=Amount gt 100
Run Code Online (Sandbox Code Playgroud)