Linq OData“Where”子句中的嵌套列表

3

假设我有以下 OData Linq 查询语句(针对 http://odata.netflix.com/v2/Catalog 执行):

Genres.Where(x=>x.Name=="Adventures")
      .Select(y=> new
                  {
                    Genre = y.Name, 
                    Movie = y.Titles.Select(l=> new 
                                                {
                                                   l.Name, 
                                                   l.AverageRating
                                                 })
                    })

我该如何更改此查询以给我平均评分为3的行?

(注意:此问题的重点是找出如何对主查询项的扩展子列表属性进行where子句。我的实际查询甚至不针对Netflix OData源。)


Genres.Where(x=>x.Name=="Adventures" && x.Titles.Any(t => t.AverageRating == 3))根据条件筛选,选择名称为“冒险”,并且拥有平均评分为3的作品的种类。 - Bala R
@BalaR - 在当前版本的WCF数据服务中不支持Any(但在下一个版本中会支持)。 - Vaccano
1个回答

1
简短的回答是目前不可能实现。 $filter总是(且仅)应用于顶级实体集。目前没有办法过滤扩展的实体集。 $filter可以进入扩展的实体集,但结果始终会过滤顶级集。在V2中,它适用于单例导航属性($filter中的表达式可以遍历这些属性),在V3中,您还可以使用任何/所有来合并集合导航属性。
无法实现的原因是OData协议未定义嵌套过滤器的URI语法。实际上,除了扩展本身和投影之外,它几乎没有定义任何扩展实体集上的运算符。

那么你的意思是V3版本将支持在扩展实体集上使用$filter吗? - Vaccano
好的,谢谢。实际上我需要的就是你所描述的(根据扩展集合的内容过滤顶层项目)。谢谢! - Vaccano
OData V3的发布是否与Visual Studio 11有关?(这是您可以谈论的内容吗?) - Vaccano
我认为我弄清楚了这个版本是附加在Visual Studio 11版本上的。至少OData V3所依赖的EF内容附加在.NET 4.5版本上。由于它们都在2011年6月一起进行了CTP,我猜想它们会同时发布。我将等待.NET 4.5版本发布以获取这些功能。(注意:这是EF团队确认他们正在等待.NET 4.5发布的帖子(在评论中):http://blogs.msdn.com/b/adonet/archive/2011/09/28/ef-4-2-release-candidate-available.aspx#comments) - Vaccano
我还不能确定日期,但下一个WCF DS版本不依赖于4.5中下一个EF版本。如果您感兴趣,我们刚刚发布了一个新的CTP。 - Vitek Karas MSFT
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接