2012-02-07 11 views
20

Ho dato alcuni servizi web per accedere alle informazioni.

La prima cosa che ho provato a espandere un nodo. E ho fatto con successo con seguente codice

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

ora voglio filtrare ServiceOfferingID che mi metterò in caso di ampliamento ServiceOfferings. Come si può utilizzare l'opzione filtro contro una collezione ampliata

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

Ma non il suo lavoro. Qual è il modo giusto per fare lo stesso

+0

Risposta breve: modificare il punto in una barra, ad esempio '& $ filter = ServiceOfferings/ServiceOfferingID eq 127' dovrebbe funzionare. – BrainSlugs83

risposta

6

In OData il comando Filtro funziona solo sull'elemento di livello superiore. Per il vostro filtro per lavorare si avrebbe bisogno di avere il seguente URL

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

Ovviamente questo non è la query che si sta tentando di scrivere, ma dietro le quinte la query viene convertito ad un albero di espressione che ha un'espressione radice basata sull'elemento di livello superiore.

Se davvero avete richiesto per filtrare i dati che si potrebbe potenzialmente intercettare la query e scrivere il proprio espressione come di seguito:

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

@nil se leggi la domanda in realtà stanno parlando del filtraggio su un'espansione che è ciò che risponde il mio rispondente, questo è diverso dal filtraggio su un tipo complesso, quindi anche se potresti dire che questo non è vero è per l'espansione – SCB

-1

È inoltre possibile raggiungere questo obiettivo attraverso un WebGet sul servizio. Ho dovuto fare qualcosa di simile al filtro per proprietà delle proprietà.

35

La query avrete bisogno di scrivere dipende dalla cardinality della collezione espanso.

Ecco alcuni esempi che utilizzano il pubblico sample OData Northwind service, provided by odata.org.

Un ordine viene sempre eseguito da un solo cliente.

Trova gli ordini effettuati da un cliente con un nome specifico: http://services.odata.org/V3/Northwind/Northwind.svc/Orders?$expand=Customer&$filter=Customer/CompanyName eq 'Vins et alcools Chevalier'. Questo è equivalente alla risposta di Dhawal.

Un cliente può emettere molti ordini.

Utilizzare il quantifierstutto o qualsiasi per specificare se si desidera che almeno uno, o tutti gli ordini di obbedire le vostre condizioni.

  1. trovare clienti per i quali uno o più ordini sono stati elaborati da un dipendente specifico: http://services.odata.org/V3/Northwind/Northwind.svc/Customers?$expand=Orders&$filter=Orders/any(o: o/EmployeeID eq 9)
  2. trovare i clienti che non hanno ordinato nulla per un lungo periodo di tempo: http://services.odata.org/V3/Northwind/Northwind.svc/Customers?$expand=Orders&$filter=Orders/all(o: o/OrderDate lt DateTime'1997-01-01')

Puoi chiama http://services.odata.org/V3/Northwind/Northwind.svc/$metadata e ispeziona gli elementi NavigationProperty per vedere quali relazioni esistono.

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

Poi, cercare un'associazione con quel nome e troverete la cardinalità:

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

la percorrenza di una relazione uno-a-molti in questo modo: http://services.odata.org/V3/Northwind/Northwind.svc/Customers?$expand=Orders&$filter=Orders/EmployeeID eq 9, vi darà: " Il valore padre per un accesso di proprietà di una proprietà "EmployeeID" non è un valore singolo. L'accesso alla proprietà può essere applicato solo a un singolo valore. "

la percorrenza di una relazione molti-a-uno con tutti o, come http://services.odata.org/V3/Northwind/Northwind.svc/Orders?$expand=Customer&$filter=Customer/any(c: c/CompanyName eq 'Vins et alcools Chevalier'), vi darà: "Qualsiasi/Tutto può essere utilizzato solo a seguito di una collezione".

A proposito, all() e any() sono in realtà il Universal quantifier, ∀() e il existential quantifier, ∃(), rispettivamente, che si può ricordare da classe di matematica.

+0

molto aiuto ... Grazie – danbord

Problemi correlati