Mam działający (uproszczony) ODataController
za pomocą następującej metody.Jak utworzyć instancję ODataQueryOptions
public class MyTypeController : ODataController
{
[HttpGet]
[EnableQuery]
[ODataRoute("myTypes")]
public IQueryable<MyType> GetMyTypes(ODataQueryOptions<MyType> options)
{
return _repo.myResultsAsQueryable();
}
}
Chciałbym móc wywołać tę metodę z serwera i do tego muszę instancję ODataQueryOptions
która wymaga ODataQueryContext
zrobić.
Istnieją przykłady, jak to zrobić (np. here i here), ale wszystkie wydają się odwoływać do poprzedniej wersji OData. Konstruktor ODataQueryContext wymaga obecnie trzeciego argumentu (ścieżka ODataPath
), który nie jest opisany w żadnych przykładach, które można znaleźć.
Edit: @snow_FFFFFF, Oto niektóre więcej kontekst ... Zdaję sobie sprawę, że mogę po prostu zużywają końcowy OData za pośrednictwem HttpClient ale chciałbym wchodzić w interakcje z IQueryable bezpośrednio jak mówisz.
Problem polega na tym, że aplikacja, nad którą pracuję, umożliwia użytkownikom tworzenie filtrów (takich jak wyrafinowana wyszukiwarka), które można zapisać i później przywołać przez innych użytkowników. Z klienta JS po prostu wyszukują filtr według identyfikatora i wysyłają zapytanie do punktu końcowego OData z filtrem zastosowanym do ciągu zapytania. Działa to bardzo dobrze od strony klienta, ale chciałbym móc zrobić coś podobnego również po stronie serwera.
To jest to, co chciałbym zrobić, ale jak mogę utworzyć argument ODataPath?
public IQueryable<MyType> FilterMyTypes(int filterID)
{
// lookup filter by filterID from db...
filter = "$filter=Status eq 1"; // for example...
ODataPath path = // but how can I get the path!!!
new ODataQueryContext(edmModel, typeof(MyType), path);
var uri = new HttpRequestMessage(HttpMethod.Get, "http://localhost:56339/mytypes?" + filter);
var opts = new ODataQueryOptions<MyType>(ctx, uri);
var results = new MyTypeController().GetMyTypes(opts);
}
Innym zastosowaniem byłoby wspieranie dynamicznego grupowania jak poniżej:
[HttpGet]
[Route("myTypes/{filterID:int}/groupby/{groupByFieldName}")]
public IHttpActionResult GroupMyTypes(int filterID, string groupByFieldName)
{
// For example: get all Active MyTypes and group by AssignedToUserID...
// Get the results of the filter as IQueryable...
var results = FilterMyTypes(filterID);
// group on groupByFieldName
var grouped = results.GroupBy(x => GetPropertyValue(x,groupByFieldName));
// select the groupByFieldName and the count
var transformedResults = grouped.Select(g => new { g.Key, Count = g.Count() });
return Ok(transformedResults);
}
W http://github.com/OData/WebApi można znaleźć wiele przypadków testowych. Na przykład ODataQueryContext, można przejść do: https://github.com/OData/WebApi/blob/master/OData/test/UnitTest/System.Web.OData.Test/OData/Query/ODataQueryContextTests.cs#L181- L200 –
Dzięki Sam, spróbuję tego .. Nie przyzwyczaiłem się do MS z otwartym źródłem ... –
Sam. Jesteś niesamowity! Jeśli umieścisz to w odpowiedzi, mogę to zaakceptować. Dzięki wielkie. Pracował jak urok. –