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!
Ś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). –
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