我按照这篇精彩文章《使用LINQPad查询Stack Overflow》中的指南设置了Stack Overflow的OData提要,我想做一些类似于以下的事情:
Users.Where(x=>x.Badges.Count==0).Take(5)
获取没有徽章的用户(“徽章?我们不需要臭的徽章!”)。我收到一个DataServiceQueryException错误:
![error snapshot](https://istack.dev59.com/7LDhN.webp)
Users.Where(x=>x.Badges.Count==0).Take(5)
获取没有徽章的用户(“徽章?我们不需要臭的徽章!”)。我收到一个DataServiceQueryException错误:
不幸的是,OData不支持聚合函数-它仅支持有限的查询函数集 在此处描述。
Aggregate operators
All aggregate operations are unsupported against a DataServiceQuery, including the following:
Aggregate Average Count LongCount Max Min Sum
Aggregate operations must either be performed on the client or be encapsulated by a service operation.
希望微软未来能够增强OData客户端 - 令人沮丧的是(好像)拥有LINQ的所有功能,却不能使用它。
看起来徽章没有计数属性。这就是异常发生的原因。
<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>
你可能需要处理每个用户,检查徽章导航属性是否解析为任何内容。
目前不支持根据导航属性中实体数量进行过滤(正如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