如果我执行以下操作,我将尝试在以id为例的路由(用户)上使用[EnableQuery]:
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
此外,如果您有一些最佳做法来分享,将不胜感激!
发布于 2019-05-05 12:29:11
两者都使用IQueryable接口,但我仍然不明白为什么它不能工作
不同之处在于,虽然“非工作”方法声称返回IQueryable<UserEntity>
public ActionResult<IQueryable<UserEntity>> GetUserEntity(long id)该实现返回单个物化UserEntity实例。
为了匹配声明,实现应该是这样的(基本上是应用了Where子句的第一个方法):
return Ok(_context.Users.Where(u => u.Id == id));发布于 2020-05-26 17:44:28
参数名应该是键,而不是id,即
[EnableQuery]
public IActionResult Get(int key)
{
return Ok(_repository.Get(key));
}发布于 2021-03-26 08:05:08
正如Ivan所描述的,您的代码返回一个物化实体。您确实需要返回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)));
这将返回所需的内容:一个实体(没有数组),可以应用$expand。
https://stackoverflow.com/questions/55991201
复制相似问题