Reputation: 39524
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
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
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
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