Linq加入和分组

时间:2014-03-13 11:34:16

标签: linq group-by

我正在尝试在linq中编写以下PLSQL查询,但是我对该组有点不了解:

    select 
sub.EmpID,
Min(sub.Stage1) Stage1,
Min(sub.Stage2) Stage2,
Min(sub.Stage3) Stage3,
Min(sub.Prob1) Prob1,
Min(sub.Prob2) Prob2


from

(select 
det.det_numbera EmpID,
case when apr.apr_performa = '1'
  then max(apr.apr_datec)
  else null
end Stage1,
case when apr.apr_performa = '2'
  then max(apr.apr_datec)
  else null
end Stage2,
case when apr.apr_performa = '3'
  then max(apr.apr_datec)
  else null
end Stage3,
case when apr.apr_performa = '5'
  then max(apr.apr_datec)
  else null
end Prob1,
case when apr.apr_performa = '6'
  then max(apr.apr_datec)
  else null
end Prob2

from emdet det

left outer join emapr apr
on det.det_numbera = apr.det_numbera

group by det.det_numbera, apr.apr_performa) sub

group by sub.Empid

我已经设法部分执行了子查询,但是在我可以使外部查询工作之前,它已经取消了分组:

        public List<ComplianceDetails> MyComplianceDetails(List<JobDetail> staff, List<Compliance> compliance)
    {
        List<ComplianceDetails> compdet =
            (from s in staff
             join c in compliance on s.EmpID equals c.EmpId into staffcomp
             from sc in staffcomp.DefaultIfEmpty()
             group s by new { s.EmpID, sc.Stage } into grp


             select new ComplianceDetails(
                 s.EmpID,
                 s.Position,
                 s.Department,
                 s.Division,
                 s.Contract,
                 s.ContService,
                 s.Probation,
                 s.Sessional,
                 s.Teaching,
                 sc.Stage == "1" ? staffcomp.Max(a => a.LastDate) : (DateTime?)null,
                 sc.Stage == "2" ? staffcomp.Max(a => a.LastDate) : (DateTime?)null,
                 sc.Stage == "3" ? staffcomp.Max(a => a.LastDate) : (DateTime?)null,
                 sc.Stage == "5" ? staffcomp.Max(a => a.LastDate) : (DateTime?)null,
                 sc.Stage == "6" ? staffcomp.Max(a => a.LastDate) : (DateTime?)null
               )
            ).ToList();
        return compdet;
    }

EDIT //

感谢您的帮助,您引导我非常接近解决方案,这似乎按预期工作:

        public List<ComplianceDetails> MyComplianceDetails(List<JobDetail> staff, List<Compliance> compliance)
    {
        string[] tQuals = new string[] { "21", "22", "23", "24" };

        var compdet =
            (from det in staff
         join apr in compliance on det.EmpID equals apr.EmpId
             into JoinedList
         from apr in JoinedList.DefaultIfEmpty()

         group new { det, apr } by 
               new 
               { 
                   det.EmpID, 
                   Stage = apr == null ? "" : apr.Stage

               } into GroupedList

         select GroupedList.Select(u => new
            {
                    EmpID = u.det.EmpID,
                    FullName = u.det.FullName,
                    Position = u.det.Position,
                    Department = u.det.Department,
                    Division = u.det.Division,
                    Contract = u.det.Contract,
                    ContService = u.det.ContService,
                    Probation = u.det.Probation,
                    Sessional = u.det.Sessional,
                    Teaching = u.det.Teaching,
                    Stage1 = u.apr == null ? null : (u.apr.Stage == "1" ? GroupedList.Max(t => t.apr.LastDate) : (DateTime?)null),
                    Stage2 = u.apr == null ? null : (u.apr.Stage == "2" ? GroupedList.Max(t => t.apr.LastDate) : (DateTime?)null),
                    Stage3 = u.apr == null ? null : (u.apr.Stage == "3" ? GroupedList.Max(t => t.apr.LastDate) : (DateTime?)null),
                    Prob1 = u.apr == null ? null : (u.apr.Stage == "5" ? GroupedList.Max(t => t.apr.LastDate) : (DateTime?)null),
                    Prob2 = u.apr == null ? null : (u.apr.Stage == "6" ? GroupedList.Max(t => t.apr.LastDate) : (DateTime?)null),
                    EduType = u.apr == null ? string.Empty : (tQuals.Contains(u.apr.Stage) ? u.apr.StageDesc : string.Empty),
                    EduDate = u.apr == null ? null : (tQuals.Contains(u.apr.Stage) ? GroupedList.Max(t => t.apr.LastDate) : (DateTime?)null)
                })
            )
            .SelectMany(u => u)
            .GroupBy(u => u.EmpID)
            .Select(u => new ComplianceDetails
            (
                u.Key,
                u.First().FullName,
                u.First().Position,
                u.First().Department,
                u.First().Division,
                u.First().Contract,
                u.First().ContService,
                u.First().Probation,
                u.First().Sessional,
                u.First().Teaching,
                u.Where(t => t.Stage1 == u.Max(T => T.Stage1)).Select(g => g.Stage1).FirstOrDefault(),
                u.Where(t => t.Stage2 == u.Max(T => T.Stage2)).Select(g => g.Stage2).FirstOrDefault(),
                u.Where(t => t.Stage3 == u.Max(T => T.Stage3)).Select(g => g.Stage3).FirstOrDefault(),
                u.Where(t => t.Prob1 == u.Max(T => T.Prob1)).Select(g => g.Prob1).FirstOrDefault(),
                u.Where(t => t.Prob2 == u.Max(T => T.Prob2)).Select(g => g.Prob2).FirstOrDefault(),
                u.Where(t => t.EduDate == u.Max(T => T.EduDate)).Select(g => g.EduType).FirstOrDefault(),
                u.Where(t => t.EduDate == u.Max(T => T.EduDate)).Select(g => g.EduDate).FirstOrDefault()
            ))
            .ToList();

        return compdet;
    }

1 个答案:

答案 0 :(得分:1)

这相当于linq的{​​{1}},请查看:

tsql