es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Ordenar por recuento filtrado de colección anidada.

Estoy tratando de ordenar por el conteo filtrado de una colección anidada y no pude descubrir cómo hacerlo en OData.

Utilizaré la API pública de OData (de Microsoft) para una demostración y explicaré lo que quiero decir, no se requiere autorización.

Entonces, tenemos “People” allí.

https://services.odata.org/TripPinRESTierService/People

Estas “People” tienen “Trips”.

https://services.odata.org/TripPinRESTierService/People?$expand=Trips

Si quiero filtrar los “Trips” por “Name”, es fácil.

https://services.odata.org/TripPinRESTierService/People?$expand=Trips($filter=Name eq ‘Trip in Beijing’)

Si quiero ordenar las “People” por el conteo de “Trips”, también es fácil.

https://services.odata.org/TripPinRESTierService/People?$expand=Trips($count=true)&$orderby=Trips/$count desc

Pero no puedo ordenar por el conteo filtrado de “Trips” (para el caso en que $expand=Trips($filter=Name eq ‘Trip in Beijing’))

https://services.odata.org/TripPinRESTierService/People?$expand=Trips($count=true;$filter=Name eq ‘Trip in Beijing’)&$orderby=Trips/$count desc

Algo como “$orderby=Trips($filter=Name eq ‘Trip in Beijing’)/$count desc” o “$orderby=Trips/$count($filter=Name eq ‘Trip in Beijing’) desc” no funciona (arroja un error del servidor “No se pudo encontrar una propiedad llamada ‘Name’ en el tipo ‘Trippin.Person’.”).

Versión de esta URL para ver los datos mínimos requeridos:

https://services.odata.org/TripPinRESTierService/People?$expand=Trips($top=0;$count=true;$filter=Name eq 'Trip in Beijing')&$orderby=Trips/$count desc&$select=Trips

Actualización: Estoy usando “Microsoft.AspNetCore.OData” versión 7.5.7 en mi proyecto, que depende de “Microsoft.OData.Core” versión 7.7.3 (no está instalado explícitamente). Probablemente, si Microsoft actualiza la versión de OData en su API, también funcionará.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Desafortunadamente, en este momento parece que OData no admite ordenar por una cuenta filtrada de una colección anidada. Las soluciones intentadas en los ejemplos proporcionados (&$orderby=Trips($filter=Name eq 'Viaje en Pekín')/$count desc o &$orderby=Trips/$count($filter=Name eq 'Viaje en Pekín') desc) no funcionan y resultan en un error del servidor.

    Es posible que las futuras actualizaciones de OData añadan soporte para esta funcionalidad. Mientras tanto, puede ser necesario explorar soluciones alternativas, como recuperar los datos y realizar el filtrado y la ordenación en el código de la aplicación.

Comments are closed.