Фильтр OData $ с элементами в расширении $ - PullRequest
22 голосов
/ 07 февраля 2012

Я дал несколько веб-сервисов для доступа к информации.

Первое, что у меня есть, пытается развернуть узел.И я сделал это успешно с помощью следующего кода

http://www.domain.com/ODataService/WorkService.svc/CaseStudies?format=json&$expand=ServiceOfferings

Теперь я хочу отфильтровать ServiceOfferingID, который я получу при расширении ServiceOfferings.Как можно использовать параметр фильтра для расширенной коллекции

http://www.domain.com/ODataService/WorkService.svc/CaseStudies?format=json&$expand=ServiceOfferings&$filter=ServiceOfferings.ServiceOfferingID eq 127 

Но это не работает.Как правильно сделать то же самое

Ответы [ 4 ]

39 голосов
/ 23 января 2014

Запрос, который вам нужно написать, зависит от мощности расширенной коллекции.

Вот несколько примеров, в которых используется общедоступный пример службы OData Northwind, предоставляемой odata.org .

Заказ всегда выполняется только одним клиентом.

Найти заказы, сделанные клиентом с конкретным именем: http://services.odata.org/V3/Northwind/Northwind.svc/Orders?$expand=Customer&$filter=Customer/CompanyName eq 'Vins et alcools Chevalier' .Это эквивалентно ответу Дхавала.

Клиент может выпустить много заказов.

Использовать квантификаторы все или any , чтобы указать, хотите ли вы, чтобы хотя бы один или все заказы выполняли ваши условия.

  1. Поиск клиентов, для которых один или несколько заказов были обработаны определеннымсотрудник: http://services.odata.org/V3/Northwind/Northwind.svc/Customers?$expand=Orders&$filter=Orders/any(o: o / EmployeeID eq 9)
  2. Найти клиентов, которые давно ничего не заказывали: http://services.odata.org/V3/Northwind/Northwind.svc/Customers?$expand=Orders&$filter=Orders/all(o: o / OrderDate lt DateTime'1997-01-01 ')

Вы можете позвонить http://services.odata.org/V3/Northwind/Northwind.svc/$metadata и проверить элементы NavigationProperty, чтобы увидеть, какие отношения существуют.

<NavigationProperty Name="Orders" 
    Relationship="NorthwindModel.FK_Orders_Customers" 
    ToRole="Orders" 
    FromRole="Customers"/>

Затем посмотритедля ассоциации с этим именем вы найдете кардинальное число:

<Association Name="FK_Orders_Customers">
    <End 
         Type="NorthwindModel.Customer" 
         Role="Customers" 
         Multiplicity="0..1"/>
    <End 
         Type="NorthwindModel.Order" 
         Role="Orders" 
         Multiplicity="*"/>
    ...

Навигация отношения один-ко-многим, как это: http://services.odata.org/V3/Northwind/Northwind.svc/Customers?$expand=Orders&$filter=Orders/EmployeeID eq 9 , даст вам: "Родительское значение для доступа к свойству свойства EmployeeID не является единственным значением. Доступ к свойству может применяться толькок одному значению. "

Навигация отношения" многие к одному "со всеми или с любыми, например http://services.odata.org/V3/Northwind/Northwind.svc/Orders?$expand=Customer&$filter=Customer/any(c: c / CompanyName eq 'Vins et alcools Chevalier') ,даст вам: «Любой / Все могут использоваться только после коллекции.»

Кстати, all() и any() на самом деле Универсальный квантификатор , ∀ () и экзистенциальный квантификатор , ∃ () соответственно, который вы, возможно, помните из математического класса.

8 голосов
/ 29 сентября 2012

Фильтрация по свойствам дочернего объекта поддерживается в oData.

Вот пример: http://services.odata.org/Northwind/Northwind.svc/Orders?$filter=Customer/Country eq 'Germany'

6 голосов
/ 07 февраля 2012

В OData команда Filter работает только для элемента верхнего уровня.Чтобы ваш фильтр работал, вам понадобится следующий URL

http://www.domain.com/ODataService/WorkService.svc/CaseStudies(x)/ServiceOfferings?format=json&$filter=ServiceOfferingID eq 127

Очевидно, что это не тот запрос, который вы пытаетесь написать, ноЗа кулисами ваш запрос преобразуется в дерево выражений, которое имеет корневое выражение на основе элемента верхнего уровня.

Если вам действительно необходимо отфильтровать данные, вы можете потенциально перехватить запрос и написать собственное выражение какниже:

[QueryInterceptor("CaseStudies")]
        public Expression<Func<CaseStudie, bool>> CaseStudieFilter()
        {
            <Expression here>
        }
0 голосов
/ 07 февраля 2012

Вы также можете сделать это через веб-сервис на сервисе.Мне пришлось сделать что-то похожее на фильтр по свойствам свойств.

...