【问题标题】:How to use OData in ASP.NET Core 2.1?如何在 ASP.NET Core 2.1 中使用 OData?
【发布时间】:2019-02-19 10:39:35
【问题描述】:

我尝试在 ASP 中使用 OData。咆哮我的代码:

//============== 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."

【问题讨论】:

    标签: asp.net-web-api asp.net-core odata asp.net-core-webapi asp.net-core-2.1


    【解决方案1】:

    从ODataController 继承时,不需要使用[ApiController] 注解。删除注释,它应该可以按预期工作。 为了能够使用$take 进行查询,您需要进行设置:

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

    您还可以添加其他操作,例如Select().Expand().Filter().OrderBy().MaxTop(100).Count()

    【讨论】:

    • 我还注意到它不适用于public ActionResult&lt;List&lt;Entry&gt;&gt; GetAll() {,但适用于IActionResult Get()
    • 现在我在尝试使用 skip 或 take 时得到“参数名称:$take' is not supported”(请参阅​​我的编辑)
    • Take这种方法不存在...我做了b.Select().Expand().Filter().OrderBy().MaxTop(100).Count();
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-02
    • 2020-10-15
    • 2018-11-28
    • 2019-04-18
    相关资源
    最近更新 更多