首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OData ASP.Net Core on GET with Id?

OData ASP.Net Core on GET with Id?
EN

Stack Overflow用户
提问于 2019-05-05 10:52:20
回答 3查看 2.3K关注 0票数 4

如果我执行以下操作,我将尝试在以id为例的路由(用户)上使用[EnableQuery]

代码语言:javascript
复制
GET /users/1?$expand=Character

我想让Id 1的用户具有它的字符,但目前它在字符上返回null:

代码语言:javascript
复制
{"character":null,"id":1,"username":"Iterer","password":"motdepasse","characterId":1}

但是在(全球)的路径上,让所有用户:

代码语言:javascript
复制
GET /users?$expand=Character

我得到用户的角色,如您所见:

代码语言:javascript
复制
[{"character":{"id":1,"name":"Name"},"id":1,"username":"Iterer","password":"motdepasse","characterId":1}]

以下是我的主计长的行为:

代码语言:javascript
复制
    // 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

此外,如果您有一些最佳做法来分享,将不胜感激!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-05-05 12:29:11

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

不同之处在于,虽然“非工作”方法声称返回IQueryable<UserEntity>

代码语言:javascript
复制
public ActionResult<IQueryable<UserEntity>> GetUserEntity(long id)

该实现返回单个物化UserEntity实例。

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

代码语言:javascript
复制
return Ok(_context.Users.Where(u => u.Id == id));
票数 3
EN

Stack Overflow用户

发布于 2020-05-26 17:44:28

参数名应该是键,而不是id,即

代码语言:javascript
复制
    [EnableQuery]
    public IActionResult Get(int key)
    {
       return Ok(_repository.Get(key));
    }
票数 2
EN

Stack Overflow用户

发布于 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。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55991201

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档