使用OData和LINQ获取链接集合的计数

时间:2011-12-13 02:38:51

标签: linq odata linqpad

我为精彩文章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: error snapshot

3 个答案:

答案 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