2013-01-18 10 views
6

Używam nocnej kompilacji ASP.Net WebAPI (2013-01-16), aby uzyskać możliwe jest wsparcie OData.ASP.NET WebAPI OData - Dziedziczenie z EntitySetController <>, ale przy użyciu opcji Get (ODataQueryOptions) zamiast [Querableable] Get()

Jak mówi Meta-Me blog on MSDN OData 0.2.0-alpha release post, jest teraz EntitySetController<T>, z którego można uzyskać kontrole OData, aby zabrać dużo bólu i kodu instalacyjnego.

W EntitySetController<T> klasa implementuje Get() jako

[Queryable] 
public virtual IQueryable<TEntity> Get() 
{ 
    throw EntitySetControllerHelpers.GetNotImplementedResponse(Request); 
} 

Chciałbym skorzystać z bardziej konkretnym Get(ODataQueryOptions options) metodą oferowaną przez wsparciu ASP.Net Web API OData.

mam zakodowane jako

public IEnumerable<Patient> Get(ODataQueryOptions options) 
{ 
    IQueryable patients = entities.Patients; 

    if (options.Filter != null) 
    { 
     patients = options.Filter.ApplyTo(patients, new ODataQuerySettings()); 
    } 

    return (patients as IQueryable<Patient>).AsEnumerable(); 
} 

(miałem również ten powrót IQueryable <> i zobaczyłem kogoś innego mówić o ODataResult - to rodzaj nie mogę odkryć w tej chwili).

Jednak jeśli spróbuję użyć metody Getata opartej na ODataQueryOptions w moim własnym kontrolerze, pojawia się komunikat o błędzie dotyczący wielu akcji pasujących do żądania. W szczególności, że błąd jest

Multiple actions were found that match the request: 

System.Collections.Generic.IEnumerable`1[Dox.Server.Model.Patient] Get(System.Web.Http.OData.Query.ODataQueryOptions) on type Dox.Server.Web.Controllers.PatientController 

System.Linq.IQueryable`1[Dox.Server.Model.Patient] Get() on type System.Web.Http.OData.EntitySetController`2[[Dox.Server.Model.Patient, Dox.Server.Model, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null],[System.Guid, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]] 

Zakładam, to ze względu na rezolwerem trasy (przepraszam jeśli to słabe ASP.NET routingu terminologii) widząc get() lub dostać (...) w klasie bazowej sterownika, jak również sama klasa kontrolera.

Pytania: a) Czy istnieje sposób na dostosowanie tras, aby to naprawić? b) Jeśli nie, czy powinienem utworzyć własną wersję EntitySetController<T> i zamienić ją na metodę Get()?

Konfiguracja wywoływanej przez Application_Start() jest ograniczona do

public static void EnableOData(HttpConfiguration config) 
{ 
    var model = BuildModelImplicitly(config); 

    //As per LinqPad forum: http://forum.linqpad.net/discussion/178/odata-v3-not-working 
    IEdmEntityContainer container = model.EntityContainers().First(); 
    model.SetIsDefaultEntityContainer(container, true); 

    //config.EnableOData(model, "api"); 
    config.Routes.MapODataRoute("OData", "api", model); 

    //config.EnableSystemDiagnosticsTracing(); 

} 

Nie ma innej konfiguracji miano do czynienia z tras lub ładowarki itp Zauważ, że metoda EnableOData() na HttpConfiguration już nie istnieje w najnowsze wieczorne kompilacje, zgodnie z dyskusją CodePlex this.

Dziękuję bardzo!

Odpowiedz

13

To bardzo fajnie jest zobaczyć, że używasz naszą nightly buduje :)

Powodem dostajesz wielokrotnością błąd działania pasujące dlatego EntitySetController już definiuje metody GET. Dobrą wiadomością jest to, że EntitySetController definiuje również właściwość QueryOptions, której można użyć do pobrania opcji zapytania. Tak więc powinieneś być w stanie zastąpić metodę Get EntitySetController i użyć właściwości opcji zapytania zamiast parametru. Powinien zachowywać się dokładnie tak samo, jak w przypadku przypisania opcji zapytania do parametru akcji.

+0

Świetnie - dziękuję bardzo BARDZO :) Całkowicie przeoczyłem właściwość QueryOptions. Będę miał zabawę i wrócę, jeśli będę miał jakieś problemy (jest to piątkowe popołudnie tutaj, więc może to być weekendowa sesja hakerska). –

+0

Jeśli ktokolwiek zastanawia się, możesz zobaczyć opcje w kontrolerze, po prostu używając następującej metody "Get": 'var opts = this.QueryOptions;' – atconway

Powiązane problemy