Suppose data models look like this:
public class Person { public int Id {get;set;} public string FirstName {get;set} } public class Phone { public int Id {get;set;} public int PersonId {get;set;} public string Phone1 {get;set;} public string Phone2 {get;set;} } public class Email { public int Id {get;set;} public int PersonId {get;set;} public string Email1 {get;set;} }
then the query might look something like this
var person = from p in persons join ph in phones on ph.PersonId equals p.Id into phonesPerson from personWithPhone in phonesPerson.DefaultIfEmpty() join e in emails on e.PersonId equals p.Id into emailsPerson from personWithEmail in emailsPerson.DefaultIfEmpty() select new { PersonId = p.Id, Phone1 = personWithPhone == null ? string.Empty: personWithPhone.Phone1, Phone2 = personWithPhone == null ? string.Empty: personWithPhone.Phone2, Email = personWithEmail == null ? string.Empty: personWithEmail.Email1 }
if EF is used and the navigation fields are present, then they could be used to obtain the necessary additional information