Czy ktoś może mi wyjaśnić, kiedy powinienem dziedziczyć mój formularz kontrolny ODataController
kontra ApiController
?ApiController kontra ODataController podczas ujawniania DTO
Pytanie jest spowodowane faktem, że wyniki zwrócone przez ApiController
mogą być filtrowane za pomocą zapytania OData.
Jeśli zastosuję QueraybleAttribute
do metod programu contollera, zapytanie zostanie przetworzone, nawet jeśli akcja zwróci IEnumerable
.
Jednak bez tego atrybutu, ale z wywołaniem config.EnableQuerySupport()
, zapytanie jest przetwarzane tylko wtedy, gdy metoda zwróci IQueryable
.
Myślę, że to nie jest spójne zachowanie. WebAPI documentation and examples sugeruje, że kontroler musi odciążyć się od ODataController. I jestem nieco zdezorientowany.
Albo ApiController
accidentally
i częściowo obsługuje część (przynajmniej $ pominięcie, $ filtr i $ górę) protokołu OData. Lub jest to zgodne z projektem i potrzebuję ODataController do kompletnego ODataSupport.
Prawdziwym problemem jest to, że moja usługa naraża DTO, a nie POCO. Nie może istnieć jedno do jednego odwzorowania. Konieczne jest przekonwertowanie zapytania OData ponownie DTO do zapytania EF na POCO.
Teraz tylko gra z OData. Pobieram encje i zamieniam je na DTO. Prawdą jest, że nie jest to bardzo wydajne, aby uzyskać wszystkie z DB dla każdego żądania, ale tolerować eksperymenty. Jednak nie ma potrzeby zwracania wszystkich elementów do klienta, jeśli wymaga on niektórych filtrowanych podzbiorów DTO.
Zapytanie OData zaczęło działać po wyjęciu z pudełka z atrybutem ApiController i Querayble, ale wspomniana wyżej niespójność sprawia, że coś robię źle.
Myślę, że to dlatego, że realizuje dodatkowe funkcje jak metadanych umożliwiający klienta WCF Data Services do wykorzystania: http://sravi-kiran.blogspot.co.nz/2013/ 08/ConsumingWebApiODataFromNetAndJavaScriptClientApplications.html, http://blogs.msdn.com/b/webdev/archive/2013/01/29/getting-started-with-asp-net-webapi-odata-in-3-simple-steps.aspx, http://www.asp.net/web-api/overview/odata-support-in-aspnet-web-api. Web API (z obsługą zapytań) pojawił się w styczniu 2012 r., A interfejsy API w interfejsie API w styczniu 2013 r., Więc myślę, że masz rację z tym, że "Potrzebuję ODataController dla kompletnego ODataSupport", aby dopasować specyfikację OData. – Michael