我应该如何从一个Controller Action返回两个对象列表?

Cha*_*tra 4 c# linq asp.net json asp.net-mvc-4

我有两个不同的列表来自同一个对象.我希望将这两个作为单独的列表同时获取,或者在返回JSON对象时加入这两个相同的列表.

这是我的代码.

List<User> userEntity = users.Where(s => s.Id == Id).ToList();

var GetUserNames = userEntity.SelectMany(s => s.Names.Select(u =>
    new
    {
        Name = u.Name,
        Id = u.Id
    })).ToList();

var GetProfile = userEntity.SelectMany(s => s.Profile.Select(u =>
    new
    {
        Name = u.Name,
        Id = u.Id
    })).ToList();

return Json(GetUserNames, JsonRequestBehavior.AllowGet);
Run Code Online (Sandbox Code Playgroud)

Tet*_*Oni 7

我更喜欢这样做:返回的项目是不同的类型.而不是返回带有类型鉴别器的裸JSON列表,而是返回一个多属性JSON对象:

return Json(new 
{ 
    Names = GetUserNames, 
    Profiles = GetProfile 
}, JsonRequestBehavior.AllowGet);
Run Code Online (Sandbox Code Playgroud)

您返回的JSON将以{Name, Id}草图形式将对象分为其类型:

{ 
  Names: [
   {Name:"UserName", Id:"3"}, 
   {Name:"OtherUser", Id: "4"}
  ],
  Profiles: [
   {Name:"Normal", Id:"1"}, 
   {Name:"Admin", Id: "99"}
  ]
}
Run Code Online (Sandbox Code Playgroud)

在大多数JSON.Net客户端解析方案中(即从WPF智能客户端使用WebAPI),您自动映射(例如来自RestSharp)将允许您将其反序列化为表单的类

public class NameId
{
     public int Id {get; set;}
     public string Name {get; set;}
}

public class UserNamesResponse
{
     public List<NameId> Names {get; set;}
     public List<NameId> Profiles {get; set;}
}
Run Code Online (Sandbox Code Playgroud)

这可能比交错列表更方便,更清晰,无论如何必须将其过滤到单独的列表中....(或者在UI绑定层中以性能损失通过过滤类型转换器...)