Miguel Moura
Miguel Moura

Reputation: 39524

Get property of many list of objects

I have the following object:

public class User {
  public Int32 Id { get; set; }
  public List<Language> Languages { get; set; }
  public List<Skill> Skills { get; set; }
}

public class Language {
  public Int32 Id { get; set; }
  public String Name { get; set; }
}

public class Skill {
  public Int32 Id { get; set; }
  public String Name { get; set; }
}

Then I have the following query:

List<UserModel> models = context.Users.Select(x =>
  new UserModel {
    Id = x.Id,
    Names = ????
  }).ToList();

I need to take:
1. The name of the first User Language, if any.
2. The names of the first 2 User Skills, if any.

And add those names to UserModel.Names where UserModel is:

public class UserModel {
  public Int32 Id { get; set; }
  public List<String> Names { get; set; }
}

How can I do this in my query?

Upvotes: 2

Views: 84

Answers (3)

KHL
KHL

Reputation: 475

You can use take and skip :

var ListUserModel = context.Users.Select(u => new UserModel { Id = u.Id, Names 
= new List<string> { u.Languages.FirstOrDefault().ToString(), 
u.Skills.Take(1).ToString(), u.Skills.Skip(1).Take(1).ToString() } });

Upvotes: 0

fdafadf
fdafadf

Reputation: 819

 Func<User, IEnumerable<string>> getUserLanguageNames = user => user.Languages.Select(language => language.Name);
 Func<User, IEnumerable<string>> getUserSkillNames = user => user.Skills.Select(skill => skill.Name);
 List<UserModel> models = context.Users.Select(user => new UserModel { Id = user.Id, Names = getUserLanguageNames(user).Concat(getUserSkillNames(user)).ToList() }).ToList();

Upvotes: 0

Aleks Andreev
Aleks Andreev

Reputation: 7054

You can use Take and Concat. Please try this code:

List<UserModel> models = context.Users.Select(x =>
  new UserModel {
    Id = x.Id,
    Names = x.Languages.Take(1).Select(y=>y.Name)
     .Concat(x.Skills.Take(2).Select(y => y.Name)).ToList()
  }).ToList();

Upvotes: 3

Related Questions