C# asp.net核心api中的返回集合
我有一个带有ef核心的这些模型的小apiC# asp.net核心api中的返回集合,c#,asp.net,.net,asp.net-core,asp.net-core-mvc,C#,Asp.net,.net,Asp.net Core,Asp.net Core Mvc,我有一个带有ef核心的这些模型的小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; } } publ
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; }
}
更新:所以我用dotnet命令行运行了这个应用程序,得到了
{"firstName":"Bill","lastName":"Johnson","serviceAccounts":[{"id":1,"camsUser":{"firstName":"Bill","lastName":"Johnson","company":null
如果子实体被设置为延迟加载,那么您应该获取帐户和用户作为
var user = await _appDbContext.Users.Include(u => u.Accounts).SingleAsync(c => c.Id == userId.Value);
我是这样想的:
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
});
您当前收到的响应是什么?您使用的是Ef Core吗?问题,如果您只是设置派生对象的值,为什么要定义用户属性?您只需将
user
作为要返回的对象传递给value即可?消费者可以浏览每个属性。对帐户使用Include。user
对象是否包含帐户?如果不是,那么您应该将其作为fetch语句的一部分。这不再是必需的。@Nikolaus的确,事实上Visual Studio现在会要求您简化它。此答案的“如果子实体…”部分是OP问题的解决方案。它隐藏在与返回类型无关的东西中。我这样做了,VisualStudio显示了一个200成功响应,用户var有帐户信息,但是postman抛出errors@Valuator/Nikolaus-谢谢,如果声明匿名类型时没有道具名称,我不知道这一点。我已经更新了我的答案,只包含相关部分。再次感谢。我猜序列化Json.yep时是循环引用错误,就是这样。您可以尝试将ReferenceLoopHandling.Ignore
添加到您的Startup.cs
文件中,如下所述:为了避免像这样实例化单独的集合,结果可能会有所不同。
var user = await _appDbContext.Users.Include(u => u.Accounts).SingleAsync(c => c.Id == userId.Value);
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
});