【问题标题】:return collection in asp.net core api在 asp.net core api 中返回集合
【发布时间】:2018-05-17 17:15:09
【问题描述】:

我有一个带有 ef-core 的模型的小 api

public class AppUser : IdentityUser
{
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public string Company { get; set; }
    public ICollection<Account> Accounts { get; set; }
}

public class Account
{
    public int id { get; set; }
    public AppUser User { get; set; }
    public string AccountNumber { get; set; }
}

我有一个控制器获取函数:

[HttpGet]
public async Task<IActionResult> Home()
{
    // retrieve the user info
    //HttpContext.User
    var userId = _caller.Claims.Single(c => c.Type == "id");
    var user = await _appDbContext.Users.SingleAsync(c => c.Id == userId.Value);            

    return new OkObjectResult(new
    {
        Message = "This is secure API and user data!",
        user.FirstName,
        user.LastName,
        user.Accounts
    });
}

如何让控制器返回帐户列表?在调试中,我可以看到具有正确数据的“帐户”变量,我只是不确定如何格式化该变量并将其返回 api

我目前正在接收:

{
"message": "This is secure API and user data!",
"firstName": "Bill",
"lastName": "Johnson",
"serviceAccounts": null
}

更新:所以我使用 dotnet 命令行运行了应用程序并得到了

{"firstName":"Bill","lastName":"Johnson","serviceAccounts":[{"id":1,"camsUser":{"firstName":"Bill","lastName":"Johnson","company":null

【问题讨论】:

  • 您目前收到什么回复?
  • 你在使用 Ef-Core 吗?
  • 问题,如果你只是设置一个派生对象的值,你为什么要定义用户属性?您可以简单地将user 作为要返回的对象传递给值吗?消费者可以通过每个属性。
  • 对帐户使用 Include。
  • user 对象检索是否包含帐户?如果没有,那么您应该将其包含在 fetch 语句中

标签: c# asp.net .net asp.net-core asp.net-core-mvc


【解决方案1】:

如果子实体设置为延迟加载,那么您应该获取帐户和用户为

var user = await _appDbContext.Users.Include(u => u.Accounts).SingleAsync(c => c.Id == userId.Value); 

【讨论】:

  • 这已经没有必要了。
  • @Nikolaus 确实如此,事实上 Visual Studio 会唠叨你现在简化它。
  • 此答案的“另外,如果子实体...”部分是解决 OP 问题的方法。它隐藏在与返回类型无关的东西中。
  • 我这样做了,Visual Studio 显示 200 成功响应,用户 var 有帐户信息,但邮递员抛出错误
  • @Valuator /Nikolaus - 谢谢,我不知道如果匿名类型声明时没有道具名称。我已经更新了我的答案,只包含相关部分。再次感谢。
【解决方案2】:

我是这样想的:

var userId = _caller.Claims.Single(c => c.Type == "id");
var user = await _appDbContext.Users.Include(s =>s.Accounts).SingleAsync(c => c.Id == userId.Value);
var accounts = user.Accounts.Select(a => new
        {
            a.AccountNumber,
            a.id
        });
return new OkObjectResult(new
        {
            user.FirstName,
            user.LastName,
            accounts
        }); 

【讨论】:

  • 我猜这是序列化 Json 时出现的循环引用错误。
  • 是的,就是这样。
  • 您可以尝试将ReferenceLoopHandling.Ignore 添加到您的Startup.cs 文件中,如下所述:stackoverflow.com/a/39642105/7897176 以避免像这样实例化单独的集合,但结果可能会有所不同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-23
  • 2016-04-06
  • 2021-11-10
  • 1970-01-01
  • 1970-01-01
  • 2017-12-10
相关资源
最近更新 更多