Получить счетчик связанной коллекции, используя OData и LINQ - PullRequest
3 голосов
/ 13 декабря 2011

Я настроил подачу OData для переполнения стека, как описано в замечательной статье Использование LINQPad для запроса переполнения стека , и я хочу сделать что-то вроде:

Users.Where(x=>x.Badges.Count==0).Take(5)

, чтобы получитьпользователи, у которых нет бейджей (« бейджи? нам не нужны вонючие бейджи! »).Я получаю DataServiceQueryException: error snapshot

Ответы [ 3 ]

8 голосов
/ 13 декабря 2011

К сожалению, OData не поддерживает агрегатные функции - он поддерживает только ограниченный набор функций запросов , описанных здесь .

Агрегатные операторы

Все агрегатные операции не поддерживаются с DataServiceQuery, в том числе:

Aggregate

Average

Count

LongCount

Max

Min

Sum

Агрегированные операции должны выполняться либо на клиенте, либо инкапсулируется сервисной операцией.

Надеемся, что Microsoft улучшит клиент OData в будущем - это расстраивает (кажется) иметь всю мощь LINQ, а затем не сможет его использовать.

1 голос
/ 13 декабря 2011

Фильтрация по количеству объектов в свойствах навигации в настоящее время не поддерживается (как уже было отмечено Джо Албахари выше). В последней версии 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
1 голос
/ 13 декабря 2011

Похоже, что Badges не имеет свойства 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>

Возможно, вам потребуется обработать каждого пользователя, чтобы проверить, разрешает ли свойство навигации Badges что-либо.

...