wcf filter filtering odata expand

wcf - Filtro OData $ con elementos en $ expandir



filter filtering (4)

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

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

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

Ahora quiero filtrar ServiceOfferingID que obtendré al expandir ServiceOfferings. Cómo puede usar la opción de filtro contra una colección expandida

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

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



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

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

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

Si realmente necesita filtrar los datos, podría interceptar la consulta y escribir su propia expresión como se muestra a continuación:

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


La consulta que necesitará para escribir depende de la cardinality de la colección expandida.

Estos son algunos ejemplos que usan el servicio de muestra pública OData Northwind, provisto por odata.org .

Un pedido siempre lo hace exactamente un cliente.

Encuentre 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.

Use todos los quantifiers para especificar si desea que al menos uno o todos los pedidos obedezcan sus condiciones.

  1. Encuentre clientes para los cuales uno o más pedidos han sido procesados ​​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. Busque clientes que no hayan 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 llamar a http://services.odata.org/V3/Northwind/Northwind.svc/$metadata e inspeccionar los elementos de NavigationProperty para ver qué relaciones existen.

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

Luego, busca una asociación con ese nombre y encontrarás la cardinalidad:

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

Navegando una relación de uno a muchos como esta: http://services.odata.org/V3/Northwind/Northwind.svc/Customers?$expand=Orders&$filter=Orders/EmployeeID eq 9 , le dará: "El 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 solo valor. "

Navegar por una relación de varios a uno con todos o cualquiera, 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á: "Any / All solo se puede usar después de una colección".

Por cierto, all() y any() son en realidad el cuantificador universal , ∀ () y el cuantificador existencial , ∃ (), respectivamente, que puede recordar de la clase de matemática.


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.