У меня есть рабочий (упрощенный) ODataController
следующим образом.Как создавать объекты ODataQueryOptions
public class MyTypeController : ODataController
{
[HttpGet]
[EnableQuery]
[ODataRoute("myTypes")]
public IQueryable<MyType> GetMyTypes(ODataQueryOptions<MyType> options)
{
return _repo.myResultsAsQueryable();
}
}
Я хотел бы иметь возможность вызывать этот метод с сервера и сделать это мне нужно создать экземпляр ODataQueryOptions
который требует ODataQueryContext
.
Есть примеры того, как это сделать (например, here и here), но все они ссылаются на предыдущую версию OData. Конструктор ODataQueryContext в настоящее время требует третьего аргумента(), который не рассматривается ни в одном из примеров, которые я могу найти.
Edit: @snow_FFFFFF, Вот еще контекст ... Я понимаю, что я могу просто потреблять конечную OData через HttpClient, но я хотел бы взаимодействовать с IQueryable непосредственно, как вы говорите.
Проблема в том, что приложение, над которым я работаю, позволяет пользователям создавать фильтры (например, сложные поисковые системы), которые могут быть сохранены и позже вызваны другими пользователями. От JS-клиента они просто ищут фильтр по id и выдают запрос к конечной точке OData с фильтром, применяемым к строке запроса. Это очень хорошо работает с клиентской стороны, но я хотел бы иметь возможность делать что-то подобное с серверной стороны.
Это то, что я хотел бы сделать, но как я могу создать экземпляр аргумента 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);
}
Другое применение этого будет поддерживать динамическую группировку, как показано ниже:
[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);
}
В http://github.com/OData/WebApi есть много тестовых примеров, к которым вы можете обратиться. Например, ODataQueryContext, вы можете обратиться к: https://github.com/OData/WebApi/blob/master/OData/test/UnitTest/System.Web.OData.Test/OData/Query/ODataQueryContextTests.cs#L181- L200 –
Спасибо Сэму, я попробую это. Не используется для MS с открытым исходным кодом ... –
Sam. Ты восхитителен! Если вы положите это в ответ, я могу принять его. Спасибо. Работал как шарм. –