OData ASP.Net Core on GET with Id?



我正在尝试在路由上 [EnableQuery](用户(,如果我做A:

GET /users/1?$expand=Character

我想让用ID 1具有其字符的用户,但目前它将我的字符返回我的null:

{"character":null,"id":1,"username":"Iterer","password":"motdepasse","characterId":1}

,但在(全局(途径上获取所有用户:

GET /users?$expand=Character

我会看到用户的角色:

[{"character":{"id":1,"name":"Name"},"id":1,"username":"Iterer","password":"motdepasse","characterId":1}]

这是我控制器的动作:

    // GET: api/Users
    [HttpGet]
    [EnableQuery]
    public ActionResult<IQueryable<UserEntity>> GetUsers()
    {
        return Ok(_context.Users);
    }
    // GET: api/Users/5
    [HttpGet("{id}")]
    [EnableQuery]
    public ActionResult<IQueryable<UserEntity>> GetUserEntity(long id)
    {
        var userEntity = _context.Users.Where(u => u.Id == id).FirstOrDefault();
        if (userEntity == null)
        {
            return NotFound();
        }
        return Ok(userEntity);
    }

两者都使用Iqueryable接口,但我仍然不明白为什么它不起作用,这是完整的控制器:

https://github.com/myerffoeg/gaium-api/blob/master/gaium/controllers/userscontroller.cs

和我的启动文件:

https://github.com/myerffoeg/gaium-api/blob/master/gaium/startup.cs

此外,如果您有一些最佳实践可以分享,这将是感谢!

两者都使用Iqueryable接口,但我仍然不明白为什么它不起作用

好吧,区别在于,"非工作"方法索赔返回 IQueryable<UserEntity>

public ActionResult<IQueryable<UserEntity>> GetUserEntity(long id)

实现返回单个实现的UserEntity实例。

为了匹配索赔,应该是这样的实现(基本上是应用Where子句的第一个方法(:

return Ok(_context.Users.Where(u => u.Id == id));

参数名称应为键而不是ID,即。

    [EnableQuery]
    public IActionResult Get(int key)
    {
       return Ok(_repository.Get(key));
    }

如伊万所述,您的代码返回一个实体化的实体。您确实需要返回IQueryable<UserEntity>,但是正如您在评论中所说的:

return Ok(_context.Users.Where(u => u.Id == id));

将用一个实体返回 array ,而不是您想要的。

您需要告诉ODATA此查询只能使用SingleResult返回零或一个实体:

return Ok(SingleResult.Create(_context.Users.Where(u => u.Id == id)));

这将返回您想要的东西:一个单个实体(无数组(,可以应用$。

最新更新