OData查询是否可以指定引用嵌套实体的过滤器?

时间:2011-09-14 07:27:39

标签: odata

这是设置:我有一个“学生”,他有一个相关的实体“课程”(1到多个)。每个“课程”都有一个相关的实体“期间”,其中包含课程的所有时间和日期详细信息。我想找回所有2011年开设课程的学生。

我试过这个:
〜/ Student()?$ expand =课程/期间& $ filter =课程/期间/年级eq 2011
但它会导致错误:类型'System.Data.Objects.DataClasses.EntityCollection`1 [[Course]]

中没有属性'Period'

显然,Period被视为属性而不是实体,但我很困惑,因为以下查询确实返回了我期望的结果,并且它使用了几乎相同的语法:
?〜/学生()$扩大=场/周期&安培; $选择=场/周期/年

我是否在使用$ filter语法做错了,或者这是不可能的?

任何见解的TIA。

2 个答案:

答案 0 :(得分:2)

如果导航属性是单例,过滤器将起作用,但由于它是一个集合(1到多个),过滤器将不起作用。主要是因为不清楚这意味着什么。你想要的学生在2011年有他们所有的课程或只是一些...等等。 在最新的CTP(http://blogs.msdn.com/b/astoriateam/archive/2011/06/30/announcing-wcf-data-services-june-2011-ctp-for-net4-amp-sl4.aspx)中,任何和所有运营商都可以支持你做你想做的事情。有关详细信息,请参阅此博文:http://www.odata.org/blog/even-more-any-and-all

答案 1 :(得分:0)

是的,应该是可能的。你需要使用这样的东西。

~/Student()?$expand=Course/Period&$filter=Course/any(d:d/Period/Year eq 2011)

Course/any()查看集合中的任何内容是否与()中的表达式匹配。

d:指定集合的​​迭代器,然后在d/Period/Year中引用。

参考资料可以在OData Documentation的第5.1.1.10.1节(搜索“/ any”)中找到。

注意:您也可以执行/ all以确保所有课程都符合某些条件。