Web API и OData- передать несколько параметров

Можно ли заставить OData сделать следующее? Я хотел бы иметь возможность запросить вызов REST путем передачи параметров, которые могут не быть первичным ключом. Могу ли я вызвать метод REST, как -> GetReports(22, 2014) или же Reports(22, 2014)?

[HttpGet]
[ODataRoute("Reports(Id={Id}, Year={Year})")]
public IHttpActionResult GetReports([FromODataUri]int Id, [FromODataUri]int Year)
{
    return Ok(_reportsRepository.GetReports(Id, Year));
}

Вот мое последнее изменение.

  //Unbound Action  OData v3
       var action = builder.Action("ListReports");
        action.Parameter<int>("key");
        action.Parameter<int>("year");
        action.ReturnsCollectionFromEntitySet<Report>("Reports");

мой метод для контроллера ReportsController

[HttpPost]
            [EnableQuery]
             public IHttpActionResult ListReports([FromODataUri] int key, ODataActionParameters parameters)

            {

                if (!ModelState.IsValid)
                {
                    throw new HttpResponseException(HttpStatusCode.BadRequest);
                }


                int year = (int)parameters["year"];
                return Ok(_reportsRepository.GetReports(key, year).Single());

            }

Я пытался назвать URL-адрес, как:

 http://localhost:6064/odata/Reports(key=5,year=2014)/ListReports

Не найден ресурс HTTP, соответствующий URI запроса 'http://localhost:6064/odata/Reports(key%3D5%2Cyear%3D2014)/ListReports'.`

1 ответ

Решение

Вы можете определить функцию импорта с именем GetReports, которая имеет два параметра.

(Примечание: имя функции импорта не может совпадать с именем набора сущностей)

Настройте модель EDM как:

        var builder = new ODataConventionModelBuilder();
        builder.EntitySet<Report>("Reports");
        var function = builder.Function("GetReports");
        function.Parameter<int>("Id");
        function.Parameter<int>("Year");
        function.ReturnsCollectionFromEntitySet<Report>("Reports");
        var model = builder.GetEdmModel();

А затем напишите свой метод как:

       [HttpGet]
         [ODataRoute("GetReports(Id={Id},Year={Year})")]
         public IHttpActionResult WhateverName([FromODataUri]int Id, [FromODataUri]int Year)
         {
             return Ok(_reportsRepository.GetReports(Id, Year));
         }

Тогда запрос

Get ~/GetReports(Id=22,Year=2014)

буду работать.

Для конечных точек OData v4.0 вам не нужно делать это функцией, вы можете просто сделать...

public class ReportsController : ODataController
{
    [EnableQuery]
    [ODataRoute("Reports({id}, {year})")]
    public IQueryable<ReportModel> Get([FromODataUri] int id, [FromODataUri] int year)
    {
        ...
    }
}

Тогда вы можете назвать это как...

/Reports(42, 2019)
Другие вопросы по тегам