我正在尝试在路由上 [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)));
这将返回您想要的东西:一个单个实体(无数组(,可以应用$。