Linq查询:分组

时间:2017-12-07 20:52:23

标签: c# linq linq-to-sql group-by distinct

我有2个表格,其中包含以下字段:

  

     

ID,LastName,FirstName

     

分配

     

PersonID,AssignmentDate,OtherField

我们说表数据如下所示:

  

     
      
  • 1,Smith,John
  •   
  • 2,艾伦,詹姆斯
  •   
  • 3,Stone,Emma
  •   
     

作业

     
      
  • 1,12/1/2016,Blue

  •   
  • 1,1 / 1/2017,Green

  •   
  • 1,1 / 1/201,红色

  •   
  • 2,5 / 5/2015,黄色

  •   

我正在制作一份报告,逻辑说明......

  • 如果AssignmentDate的年份以偶数结束,则报告偶数(如果年份是2014年,则报告2014)。
  • 如果AssignmentDate的年份以ODD号码结尾,则报告年份减1(即年份为2015年,2014年报告)。

此外,按PersonID分组,然后是#34;偶数" AssignedYear。包括所有人员和所有作业。 (我不确定我是否应该使用Group By或Distinct。在此部分感到困惑。)

我需要它根据示例表输出这些结果:

  
      
  • 1,2016

  •   
  • 2018年

  •   
  • 2,2014

  •   
  • 3, null (因为personID = 3存在,但没有作业,我们仍然希望合并此人)

  •   

你会怎么做?我已经走到了这一步,但卡住了。 :(

var t = from p in tblPersons
        join a in tblAssignments
             on p.ID equals a.PersonID into fml
        from x in fml
        select new AssignmentFilters
              {
                  PersonID = x.PersonID,
                  Person= x.tblPersons.LastName + ", " + x.tblPersons.FirstName +
                       (string.IsNullOrEmpty(x.tblPersons.PreferredName) ? "" : " (" + x.tblPersons.PreferredName + ")") +
                       (string.IsNullOrEmpty(x.tblPersons.MiddleName) ? "" : " " + x.tblPersons.MiddleName) +
                       (string.IsNullOrEmpty(x.tblPersons.Suffix) ? "" : " " + x.tblPersons.Suffix),
                  AuditStartYear = x.DateAssigned == null ? 0 : (x.DateAssigned.Year % 2 == 0 ? x.DateAssigned.Year : x.DateAssigned.Year - 1)
               };

任何帮助将不胜感激!在过去的几个小时里一直在研究这个问题,我只是感到沮丧/难倒,哈哈。谢谢!

1 个答案:

答案 0 :(得分:0)

根据您提及的具体规则隔离每人的审核

var audits = from assignment in tblAssignments
             select new
             {
                 PersonId = assignment.PersonID,
                 Year = assignment.DateAssigned == null
                     ? 0
                     : assignment.DateAssigned.Year % 2 == 0
                         ? assignment.DateAssigned.Year
                         : assignment.DateAssigned.Year - 1
             };

迭代人员并在不同的审核上留下外部联接

var results = from person in tblPersons
            from audit in
            (
                from a in audits.Distinct()
                where a.PersonId == person.ID
                select a
            ).DefaultIfEmpty()
            select new
            {
              Person = person,
              Audit = audit,
            };

这应该给你这样的东西,然后你可以进一步以你需要的任何形状投射结果

enter image description here