我为精彩文章Using LINQPad to Query Stack Overflow中所述设置了Stack Overflow的OData Feed,我想做类似的事情:
Users.Where(x=>x.Badges.Count==0).Take(5)
获取没有徽章的用户(“Badges? We don't need no stinkin' badges!”)。我得到一个DataServiceQueryException:
答案 0 :(得分:8)
不幸的是,OData不支持聚合函数 - 它只支持有限的查询函数described here。
汇总运营商
对DataServiceQuery不支持所有聚合操作, 包括以下内容:
Aggregate Average Count LongCount Max Min Sum
聚合操作必须在客户端上执行或者是 由服务操作封装。
希望微软将来会增强OData客户端 - 看起来(看似)拥有LINQ的所有功能然后无法使用它是令人沮丧的。
答案 1 :(得分:1)
看起来徽章没有Count属性。这就是异常发生的原因。
<EntityType Name="Badge">
<Key>
<PropertyRef Name="Id" />
</Key>
<Property xmlns:p8="http://schemas.microsoft.com/ado/2009/02/edm/annotation" Name="Id" Type="Edm.Int32" Nullable="false" p8:StoreGeneratedPattern="Identity" />
<Property Name="UserId" Type="Edm.Int32" Nullable="true" />
<Property Name="Name" Type="Edm.String" Nullable="true" MaxLength="50" Unicode="true" FixedLength="false" />
<Property Name="Date" Type="Edm.DateTime" Nullable="true" />
<NavigationProperty Name="User" Relationship="MetaModel.BadgeUser" FromRole="Badge" ToRole="User" />
</EntityType>
可能您需要处理每个用户以检查徽章导航属性是否解析为任何内容。
答案 2 :(得分:1)
目前不支持过滤导航属性中的实体数量(如上面的Joe Albahari所述)。在最新的CTP中,OData支持任何和所有允许您过滤“空”导航属性的功能。
见
http://blogs.msdn.com/b/astoriateam/archive/2011/10/13/announcing-wcf-data-services-oct-2011-ctp-for-net-4-and-silverlight-4.aspx to get the latest CTP.
以下是对任何/所有功能的讨论:
http://www.odata.org/blog/even-more-any-and-all