Шаблон пути для действия в контроллере не является допустимым шаблоном пути OData

Я получаю следующую ошибку:

Шаблон пути 'GetClients()' для действия 'GetClients' в контроллере 'Клиенты' не является допустимым шаблоном пути OData. Ресурс не найден для сегмента 'GetClients'.

Мой метод контроллера выглядит следующим образом

public class ClientsController : ODataController
{
    [HttpGet]
    [ODataRoute("GetClients(Id={Id})")]
    public IHttpActionResult GetClients([FromODataUri] int Id)
    {
        return Ok(_clientsRepository.GetClients(Id));
    }
}

Мой файл WebAPIConfig имеет

builder.EntityType<ClientModel>().Collection
       .Function("GetClients")
       .Returns<IQueryable<ClientModel>>()
       .Parameter<int>("Id");

config.MapODataServiceRoute(
    routeName: "ODataRoute",
    routePrefix: "odata",
    model: builder.GetEdmModel());

Я надеюсь, что смогу назвать api rest odata следующим образом:

http://localhost/odata/GetClients(Id=5)

Есть идеи, что я делаю не так?

2 ответа

Решение

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

builder.EntitySet<ClientModel>("Clients")

это все, что тебе нужно.

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

public IHttpActionResult GetClientModel([FromODataUri] int key)
{    
      return Ok(_clientsRepository.GetClients(key).Single());
}

Или же

Это то, что сработало. Выше не сработало:

public IHttpActionResult Get([FromODataUri] int key)
{    
    return Ok(_clientsRepository.GetClients(key).Single());
}

Тогда запрос Get

http://localhost/odata/Clients(Id=5)

или же

http://localhost/odata/Clients(5)

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

Обновление: используйте несвязанную функцию, чтобы вернуть много ClientModels.

Следующий код для v4. Для v3 вы можете использовать действие.

builder.EntitySet<ClientModel>("Clients");
var function = builder.Function("FunctionName");
function.Parameter<int>("Id");
function.ReturnsCollectionFromEntitySet<ClientModel>("Clients");

Добавьте метод в контроллер, например:

[HttpGet]
[ODataRoute("FunctionName(Id={id})")]
public IHttpActionResult WhateverName(int id)
{
    return Ok(_clientsRepository.GetClients(id));
}

Отправить запрос как:

GET ~/FunctionName(Id=5)

Этот маршрут неверен: [ODataRoute("GetClients(Id={Id})")]

Так должно быть: [ODataRoute("Clients({Id})")]

URL должен быть: http://localhost/odata/Clients(Id=5)

Другие вопросы по тегам