Подтвердить что ты не робот

Фильтр OData $с элементами в $expand

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

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

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 

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

4b9b3361

Ответ 1

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

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

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

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

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

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

  1. Найдите клиентов, для которых один или несколько заказов были обработаны конкретным сотрудником: http://services.odata.org/V3/Northwind/Northwind.svc/Customers?$expand=Orders&$filter=Orders/любой(o: o/EmployeeID eq 9)
  2. Найдите клиентов, которые давно ничего не заказывали: http://services.odata.org/V3/Northwind/Northwind.svc/Customers?$expand=Orders&$filter=Orders/все(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() на самом деле являются универсальным квантификатором, ∀() и экзистенциальным квантификатором, ∃() соответственно, что вы, возможно, помните из математического класса ,

Ответ 3

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

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

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

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

[QueryInterceptor("CaseStudies")]
public Expression<Func<CaseStudie, bool>> CaseStudieFilter()
{
    <Expression here>
}

Ответ 4

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