2012-02-07 30 views
20

He proporcionado algunos servicios web para acceder a la información.

Lo primero que tengo intenta expandir un nodo. Y lo he hecho con éxito con siguiente código

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

ahora quiero filtrar ServiceOfferingID que voy a obtener cuando se expande ServiceOfferings. Cómo opción de filtro puede usar contra una colección ampliada

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

Pero no su trabajo. ¿Cuál es la forma correcta de hacer lo mismo?

+0

Respuesta corta: cambie el punto por una barra inclinada, es decir '& $ filter = ServiceOfferings/ServiceOfferingID eq 127' debería funcionar. – BrainSlugs83

Respuesta

6

En OData, el comando Filtro solo funciona en el elemento de nivel superior. Para el filtro funcione, tendría que tener la siguiente URL

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

Obviamente, esto no es la consulta que se está tratando de escribir, pero detrás de las escenas de la consulta se está convirtiendo en un árbol de expresión que tiene una expresión raíz basada en el elemento de nivel superior.

Si realmente necesario para filtrar los datos que potencialmente podría interceptar la consulta y escribir su propia expresión de la siguiente manera:

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

@nil si lee la pregunta en realidad están hablando sobre el filtrado en una expansión que es lo que mi servidor responde, esto es diferente al filtrado en un tipo complejo, así que aunque puede decir que esto no es cierto es para ampliar – SCB

-1

También puede lograr esto a través de un WebGet en el servicio. He tenido que hacer algo similar para filtrar por propiedades de propiedades.

35

La consulta tendrá que escribir depende del cardinality de la colección ampliada.

Aquí hay algunos ejemplos que usan el público sample OData Northwind service, provided by odata.org.

Una orden la realiza siempre exactamente un cliente.

Encuentra los pedidos realizados por un cliente con un nombre específico: http://services.odata.org/V3/Northwind/Northwind.svc/Orders?$expand=Customer&$filter=Customer/CompanyName eq 'Vins et alcools Chevalier'. Esto es equivalente a la respuesta de Dhawal.

Un cliente puede emitir muchos pedidos.

Uso del quantifierstodo o cualquier para especificar si desea que al menos uno, o todos los órdenes de obedecer sus condiciones.

  1. clientes a encontrar para los que una o más órdenes han sido procesadas por un empleado específico: http://services.odata.org/V3/Northwind/Northwind.svc/Customers?$expand=Orders&$filter=Orders/any(o: o/EmployeeID eq 9)
  2. encontrar clientes que no han pedido nada durante mucho tiempo: http://services.odata.org/V3/Northwind/Northwind.svc/Customers?$expand=Orders&$filter=Orders/all(o: o/OrderDate lt DateTime'1997-01-01')

Puede llama al http://services.odata.org/V3/Northwind/Northwind.svc/$metadata e inspecciona los elementos de NavigationProperty para ver qué relaciones existen.

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

A continuación, buscar una asociación con ese nombre y encontrará la cardinalidad:

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

Navegación por una relación uno-a-muchos como esto: http://services.odata.org/V3/Northwind/Northwind.svc/Customers?$expand=Orders&$filter=Orders/EmployeeID eq 9, le dará: " El valor principal para un acceso de propiedad de una propiedad 'EmployeeID' no es un valor único. El acceso a la propiedad solo se puede aplicar a un único valor. "

Navegación por una relación de muchos-a-uno con la totalidad o, como http://services.odata.org/V3/Northwind/Northwind.svc/Orders?$expand=Customer&$filter=Customer/any(c: c/CompanyName eq 'Vins et alcools Chevalier'), le dará: "Cualquier/Todos sólo se puede utilizar después de una colección."

Por cierto, all() y any() son en realidad el Universal quantifier, ∀() y el existential quantifier, ∃(), respectivamente, que usted puede recordar de la clase de matemáticas.

+0

mucha ayuda ... Gracias – danbord