使用c# Linq连接行

本文关键字:连接 Linq 使用 | 更新日期: 2023-09-27 18:05:56

如果存在一个名为STUDENTS的数据表

SubjectID       StudentName
----------      -------------
1               Mary
1               John
1               Sam
2               Alaina
2               Edward

如何使用Linq:

得到下面的数据表
SubjectID       StudentName
----------      -------------
1               Mary, John, Sam
2               Alaina, Edward

我尝试使用逐个遍历每个数据流的foreach循环来实现这个结果,但是遇到了很大的性能损失。

不太会用Linq,但我在尝试。我将张贴我的答案,一旦我得到一些具体的,但任何帮助将在两者之间感激。

示例工作代码不使用Linq,但没有提供所需的性能。如果DataTable dt2有大约3500条记录,下面的foreach循环大约需要15分钟。

        DataTable dtFiles = dt2.Clone();
        //Logic to filter out the files by keyword name filter.
        foreach (DataRow row in dt2.Rows)
        {
            string studentid = row.Field<string>("StudentID");
            string filter = "StudentID = '" + studentid + "'";
            if(dtFiles.Select(filter).Count() == 0)//this means keyword is new 
            {
                DataRow dr = dtFiles.NewRow();
                dr["StudentName"] = row["StudentName"];
                dr["StudentID"] = row["StudentID"];
                dtFiles.Rows.Add(dr);
            }
            else
            {
                dtFiles.Select(filter).First<DataRow>()["StudentName"] += "," + row.Field<string>("StudentName");//Rows[0]
            }
        }

使用c# Linq连接行

获取分组数据
var subjects = 
    from r in dtFiles.AsEnumerable()
    group r by r.Field<int>("SubjectID") into g
    select new {
       ID = g.Key,
       Students = String.Join(", ", g.Select(r => r.Field<string>("StudentName"))
    };

然后构建DataTable(如果你需要的话)

DataTable dt = new DataTable();
dt.Columns.Add("SubjectID", typeof(int));
dt.Columns.Add("StudentName", typeof(string));
// or you can just clone existing DataTable:
DataTable dt = dtFiles.Clone();
foreach(var subject in subjects)
   dt.Add(subject.ID, subject.Students);  

这是之前解决方案的一点变化:

DataTable dt = dtFiles.Clone();
(from r in dtFiles.AsEnumerable()
         group r by r.Field<int>("SubjectID") into g
         select g)
         .Aggregate(dt, (d, g) =>
         {
              dt.Rows.Add(g.Key, String.Join(", ", g.Select(r => r.Field<string>("StudentName"))));
              return dt;
         });

结果将在克隆的DataTable dt中