Как использовать OData в ASP.NET Core 2.1? - PullRequest
0 голосов
/ 14 сентября 2018

Я пытаюсь использовать OData в ASP. Ниже мой код:

//============== Startup.cs
public void ConfigureServices(IServiceCollection services) {
    services.AddDbContext<EntriesContext>(
        opt => opt.UseMySql("server=localhost;database=mydb;user=myusr;password=mypass",
        mysqlOptions =>{mysqlOptions.ServerVersion(new Version(5..), ServerType.MySql);}));

    services.AddOData();
    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
    ...
    }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env) {
        ...
        app.UseMvc(b => { b.MapODataServiceRoute("odata", "odata", GetEdmModel()); });
    }

    private static IEdmModel GetEdmModel() {
        ODataConventionModelBuilder builder = new ODataConventionModelBuilder();
        builder.EntitySet<Entry>("Entries");
        return builder.GetEdmModel();
    }

Контроллер:

[Route("api/[controller]")]
[ApiController]
[EnableCors("AllowMyOrigin")]
public class EntriesController : ODataController
{
    private readonly EntriesContext _context;

    public EntriesController(EntriesContext context) {
        _context = context;
    }

    [HttpGet]
    [EnableQuery]
    public ActionResult<List<Entry>> GetAll() {
        return _context.Entries.ToList();
    }

И контекст:

public class EntriesContext : DbContext
{
    public EntriesContext(DbContextOptions<EntriesContext> options) : base(options) { }
    public DbSet<Entry> Entries { get; set; }
}

однако, мне не ясно, какой путь я должен использовать для получения записей (без OData я бы использовал localhost:9000/api/entries, но теперь я запутался).

Я пытался сделать https://localhost:44384/odata/entries и https://localhost:44384/odata/api/entries, но получаю 404

Я попытался прокомментировать маршрут контроллера, как это

//[Route("api/[controller]")]
//[ApiController]
[EnableCors("AllowMyOrigin")]
public class EntriesController : ODataController 

, а также модифицировал действие

[HttpGet]
[EnableQuery]
public IActionResult Get() {
    return Ok(_db.Entries);
}

Я попробовал тогда https://localhost:44384/odata/Entries и получил полный список записей ... Однако https://localhost:44384/odata/Entries?$take=2 не работает: 400 Плохой запрос: Parameter name: $take' is not supported."

1 Ответ

0 голосов
/ 14 сентября 2018

Вам не нужно использовать аннотацию [ApiController] при наследовании от ODataController. Удалите аннотацию, и она должна работать как положено. Чтобы иметь возможность запрашивать с помощью $take, вам необходимо настроить его:

app.UseMvc(b =>
      {
        b.Take();
        b.MapODataServiceRoute("odata", "odata", GetEdmModel());
      });

Вы также можете добавить другие действия, например, Select().Expand().Filter().OrderBy().MaxTop(100).Count()

...