使用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]
}
}
获取分组数据
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中