.net - tutorial - ApiController vs ODataController al exponer DTO
web api 2 example (2)
¿Puede alguien explicarme cuándo debo heredar mi controlador de ODataController
vs ApiController
?
La pregunta se debe al hecho de que los resultados devueltos por ApiController
se pueden filtrar con la consulta OData.
Si aplico QueraybleAttribute
a los métodos del controlador, la consulta se procesa incluso si la acción devuelve IEnumerable
.
Sin embargo, sin este atributo, pero con la llamada config.EnableQuerySupport()
, la consulta solo se procesa si el método devuelve IQueryable
.
Creo que no es un comportamiento constante. La documentación y los ejemplos de WebAPI implican que el controlador debe ingresar desde ODataController. Y estoy un poco confundido
O ApiController
admite parcial y accidentally
parte (al menos $ omitir, $ filtrar y $ superior) del protocolo OData. O esto es por diseño y necesito ODataController para completar ODataSupport.
El verdadero problema es que mi servicio expone DTO, no POCO. Puede haber asignaciones de uno a uno. No es necesario convertir ODATA consulta againts DTOs a consulta EF contra POCOs.
Ahora solo jugando con OData. Recupero entidades y las convierto en DTO. Es cierto que esto no es muy eficaz para obtener todos ellos de DB para cada solicitud que tolerale para experimentos. Pero definitivamente no hay necesidad de devolver todas las entidades al cliente si requiere algún subconjunto filtrado de DTO.
La consulta de OData comenzó a funcionar de la caja con ApiController y el atributo Querayble, pero la incoherencia antes mencionada me hace pensar que estoy haciendo algo mal.
¿Puede alguien explicarme cuándo debo heredar mi controlador de ODataController vs ApiController?
ODataController
heredar de ODataController
si desea exponer un punto final que cumpla con el protocolo OData . Si desea hacer algo más, como un punto final REST, herede de ApiController
.
Aplicar algunas partes del marco WebAPI OData pero no otras probablemente no sea una buena idea. Puede en algunos casos, pero probablemente no funcionará bien en otros. Por ejemplo, puede obtener soporte de consultas, pero el punto final $ metadata no se puede generar (eso es solo especulación, los síntomas reales pueden ser diferentes).
Parece que ya estás usando EntityFramework. Sé que hay varias muestras que muestran cómo exponer eso como un punto final OData.
Si no quiere hacer eso por alguna razón, puede implementar la consulta usted mismo. Esto se cubre brevemente en algunos lugares en este tutorial , pero lo esencial es agregar un parámetro de tipo ODataQueryOptions<T>
a su acción, y usar los métodos en él para filtrar su conjunto de resultados. Sin embargo, puede ser doloroso generar buenas consultas de base de datos para todas las posibles consultas de OData, por lo que debe evitar eso si es posible.
Esto explica las diferencias muy bien: http://blogs.msdn.com/b/alexj/archive/2012/08/15/odata-support-in-asp-net-web-api.aspx