I have a model named User
. Each user can have some social links. Now I want to get all users with their social link as a single row in the result. Here are my models:
public class User
{
public int Id { get; set; }
public string Name { get; set; }
public ICollection<SocialLink> SocialLinks { get; set; }
}
public class SocialLink
{
public string Url { get; set; }
public SocialType Type { get; set; }
public User User { get; set; }
public int UserId { get; set; }
}
public enum SocialType
{
FaceBook = 0,
Twitter = 1,
Youtube = 2,
Linkedin = 3,
GooglePlus = 4,
Telegram = 5,
Instagram = 6
}
public class UserViewModel
{
public string Name { get; set; }
public string Facebook { get; set; }
public string Twitter { get; set; }
public string Youtube { get; set; }
public string Linkedin { get; set; }
public string GooglePlus { get; set; }
public string Telegram { get; set; }
public string Instagram { get; set; }
}
I want my query to be like this in the result:
Name | Facebook | Twitter | Youtube | Linkedin | GooglePlus | Telegram | Instagram
======================================================================================
Someone | facebook | @someone | youtube | linkedin | google | @tele | @someins
I have written following query, It works as I expected but I wonder if there's a better way for doing this:
users.Select(p => new UserViewModel {
Name = p.Name,
Facebook = p.SocialLinks.FirstOrDefault(x => x.Type == SocialType.FaceBook).Url ?? "#",
Twitter = p.SocialLinks.FirstOrDefault(x => x.Type == SocialType.Twitter).Url ?? "#",
Youtube = p.SocialLinks.FirstOrDefault(x => x.Type == SocialType.Youtube).Url ?? "#",
Linkedin = p.SocialLinks.FirstOrDefault(x => x.Type == SocialType.Linkedin).Url ?? "#",
Telegram = p.SocialLinks.FirstOrDefault(x => x.Type == SocialType.Telegram).Url ?? "#",
Instagram = p.SocialLinks.FirstOrDefault(x => x.Type == SocialType.Instagram).Url ?? "#",
}).ToList();
UserViewModel
that accepts Name and a collection ofSocialLink
. Inside constructor I would useforeach
to populate properties. In your case, every callFirstOrDefault
creates anIEnumerator
that may slow down your app if there are many users. – Yuri Tceretian 14 hours ago