2015-02-26 2 views
2

У меня есть два разных списка, исходящих из одного и того же объекта. Я хочу получить эти два одновременно с отдельным списком или присоединиться к тем двум спискам при возврате объекта 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); 
+0

Хорошо, что вы хотите сделать - вернуть два отдельных списка или присоединиться к ним вместе? Если вы хотите вернуть два отдельных списка, вы можете просто использовать анонимный тип, который имеет их оба в ... –

ответ

5

Я бы предпочел сделать это по-другому: возвращенные элементы - разные типы. Вместо того, чтобы возвращать голый список JSON с типом дискриминатором, возвращает multiproperty JSON объекта:

return Json(new 
{ 
    Names = GetUserNames, 
    Profiles = GetProfile 
}, JsonRequestBehavior.AllowGet); 

Ваши вернулся JSON будет иметь {Name, Id} объектов разделен на их тип, в эскизе вида:

{ 
    Names: [ 
    {Name:"UserName", Id:"3"}, 
    {Name:"OtherUser", Id: "4"} 
    ], 
    Profiles: [ 
    {Name:"Normal", Id:"1"}, 
    {Name:"Admin", Id: "99"} 
    ] 
} 

В большинство сценариев синтаксического анализа на стороне клиента JSON.Net (например, использование WebAPI от интеллектуального клиента WPF), автоматическое сопоставление (например, от 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;} 
} 

Это может быть более удобным и понятным для работы, чем чередуемый список, который должен быть отфильтрован в отдельные списки для привязки в любом случае .... (или передается через преобразователи типа фильтрации при снижении производительности в интерфейсном слое UI ...)

+0

Это очень полезно и легко конвертируется в пользовательский интерфейс. Большое спасибо – Chatra

+0

@wpfrookie Я полностью согласен с вышеизложенным. Я думал, что ты нужен им в одном списке. :) – hutchonoid

2

Вы можете использовать GetUserNames.Concat(GetProfile).

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.Concat(GetProfile) , JsonRequestBehavior.AllowGet); 

Enumerable.Concat Method

Дополнение за комментарии

Создать класс и перечисление:

public class NameId 
{ 
    public string Name {get;set;} 
    public string Id {get;set;} 
    public ThisType Type { get; set; } 
} 

public enum ThisType 
{ 
    Username, 
    Profile 
} 

Затем вернитесь, что вместо того, чтобы:

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

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

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

return Json(GetUserNames.Concat(GetProfile) , JsonRequestBehavior.AllowGet); 
+0

@hutchnoid Я понимаю, что мы можем так пройти, но мой сценарий заключается в том, что я хочу заполнить UserNames в одном списке и Профиль в другом списке. Я получу только один объект Json. Как я могу различать и заполнять в соответствующих списках. – Chatra

+0

@WPFRookie, может быть, вы должны сделать 2 функции, если они разные. Зачем возвращать 2 разных вещи в 1 список? – Peter

+0

@peer, потому что я не хочу возвращать два раза с тем же идентификатором для двух разных списков. – Chatra

Смежные вопросы