其他分享
首页 > 其他分享> > CodeGo.net>使用LINQ将具有相同值的多行列表连接成单行

CodeGo.net>使用LINQ将具有相同值的多行列表连接成单行

作者:互联网

使用Linq查询将重复值分组到对象列表中.

我将以下数据与这些数据一起称为“ SudentAssessment”表.

AssessmentId    Username        SITSupervisor    WorkSupervisor
1              iwsp.student001  iwsp.staff001   iwsp.supervisor001
2              iwsp.student001  iwsp.staff002   iwsp.supervisor001
3              iwsp.student002  iwsp.staff001   iwsp.supervisor002
4              iwsp.student003  iwsp.staff003   iwsp.supervisor003
5              iwsp.student004  iwsp.staff001   iwsp.supervisor004
6              iwsp.student004  iwsp.staff005   iwsp.supervisor004
7              iwsp.student005  iwsp.staff003   iwsp.supervisor005

这里的问题是行号1,2和5,6具有相同的数据,但唯一的区别是SIT主管的详细信息不同.这些每行填充到StudentAssessmentDTO中,如下所示.

public class StudentAllocationDTO
{
     public int AssessmentId {get;set;}
     public string Username {get;set;}
     public string SITSupervisor {get;set;}
     public string WorkSupervisor {get;set;}
}

按照当前的实现,我在调用一个返回所有7条记录的List的方法时.由于行1,2和5,6在“ SITSupervisor”中的区别更大,我想在c#中使用LINQ分配给下面的DTO结构.

public class NEWStudentAllocationDTO
{
     public int AssessmentId {get;set;}
     public string Username {get;set;}
     public List<string> SITSupervisor {get;set;}
     public string WorkSupervisor {get;set;}
}

如果您需要进一步澄清,请在评论中让我知道.

解决方法:

通过包含公用属性的匿名类型对它们进行分组.

        IEnumerable< NEWStudentAllocationDTO> grouped = l.GroupBy(x => new { x.Username, x.WorkSupervisor })
            .Select(x => new NEWStudentAllocationDTO()
            {
                AssessmentId = x.Key.AssessmentId,
                WorkSupervisor = x.Key.WorkSupervisor,
                Username = x.Key.Username,
                SITSupervisor = x.Select(y => y.SITSupervisor).ToList()
            });

标签:list,linq-to-objects,linq,c,net
来源: https://codeday.me/bug/20191024/1923377.html