Выражение Linq с несколькими объединениями с условием в каждом соединении

У меня есть число таблиц вроде:

  • User_cs
  • UserEducation_cs
  • Опыт

следующая диаграмма базы данных введите описание изображения здесь

Мне нужна информация о пользователях

  • их основная информация из User_cs
  • Их последнее образование (то есть последняя степень, которую они приобрели)
  • Если они в настоящее время работают (если пользователь не работает), поля в Experience_cs будут NULL.

Я так могу сделать следующее, но у меня возникают проблемы 1) как в середине выражения lamda я делаю (IsWorking == true) и после этого присоединяюсь к следующей таблице. Следующее - мое выражение

   List<Models.UserInfo> v = context.User_cs
            .Join(context.UserEducation_cs, u => u.UserName, ue => ue.UserName, (u, ue) => new UserEducation_cs
            {
                UserName = ue.UserName,
                EducationId = ue.EducationId,
                StartDate = ue.StartDate,
                EndDate = ue.EndDate
            }).
            Join(context.Education_cs, ue => ue.EducationId, e => e.EducationId, (ue, e) => new
            {
                UserName = ue.UserName,
                EducationId = ue.EducationId,
                StartDate = ue.StartDate,
                EndDate = ue.EndDate,
                Title = e.Title,
                Major = e.Major,
                MajorDetails = e.MajorDetails,
                Info = e.Info
            }).
            Join(context.Experiences, lst => lst.UserName, ex => ex.UserName, (lst, ex) => new Models.UserInfo
            {
                UserName = ex.UserName,
                EducationId = lst.EducationId,
                StartDate = lst.StartDate,
                EndDate = lst.EndDate,
                Title = lst.Title,
                Major = lst.Major,
                MajorDetails = lst.MajorDetails,
                Info = lst.Info,
                IsWorking = ex.IsWorking,
                StartDate_ex=ex.StartedDate,                    
            }).
            Where(iw => iw.IsWorking == true).ToList(); 

Любая помощь будет оценена

Ответ 1

Я не совсем уверен, полностью ли понимаю ваш вопрос. Я думаю, вам нужно отфильтровать списки перед тем, как применить к ним (внутреннее) соединение. Чтобы получить только самую новую запись Education_cs для каждого User_cs, я полагаю, вы могли бы использовать группировку. Кроме того, я точно не тестировал этот код:

List<Models.UserInfo> v = context.User_cs
        .Join(context.UserEducation_cs, u => u.UserName, ue => ue.UserName, (u, ue) => new UserEducation_cs
        {
            UserName = ue.UserName,
            EducationId = ue.EducationId,
            StartDate = ue.StartDate,
            EndDate = ue.EndDate
        }).
        Join(context.Education_cs.GroupBy(q => q.UserName).Select(q => q.OrderByDescending(w => w.StartDate).First()), 
             ue => ue.EducationId, e => e.EducationId, (ue, e) => new
        {
            UserName = ue.UserName,
            EducationId = ue.EducationId,
            StartDate = ue.StartDate,
            EndDate = ue.EndDate,
            Title = e.Title,
            Major = e.Major,
            MajorDetails = e.MajorDetails,
            Info = e.Info
        }).
        Join(context.Experiences.Where(ex => ex.IsWorking), lst => lst.UserName, ex => ex.UserName, (lst, ex) => new Models.UserInfo
        {
            UserName = ex.UserName,
            EducationId = lst.EducationId,
            StartDate = lst.StartDate,
            EndDate = lst.EndDate,
            Title = lst.Title,
            Major = lst.Major,
            MajorDetails = lst.MajorDetails,
            Info = lst.Info,
            IsWorking = ex.IsWorking,
            StartDate_ex=ex.StartedDate,                    
        }).ToList();