C# 数据表。比较一列中的数据,如果匹配,则将另一列中的数据附加到相应行
C# Datatable. Compare data from a column and if it matches, append the data from another column of the corresponding row
例如,
如果我有以下数据表,
位置
名字
密码
经理
悉尼
约翰
123
布莱恩
纽约
拉里
456
雪利酒
芝加哥
梅格
789
琳达
达拉斯
马克
012
库珀
悉尼
杰克
123
布莱恩
达拉斯
钱德勒
012
库珀
悉尼
理查德
123
布莱恩
在这里,要遍历的第一列是位置。 Location 匹配的地方,遍历所有对应的 First Names 并将其保持在逗号分隔的一行中。
位置
名字
密码
经理
悉尼
约翰、杰克、理查德
123
布莱恩
纽约
拉里
456
雪利酒
芝加哥
梅格
789
琳达
达拉斯
马克,钱德勒
012
库珀
我将其存储在数据表变量 dt 中,如下所示:
DataTable dt = new DataTable();
using (SqlConnection sqlConn = new SqlConnection(ConfigurationManager.AppSettings["connectionString"].ToString()))
{
sqlConn.Open();
using (SqlCommand cmd = new SqlCommand(script, sqlConn))
{
using (SqlDataAdapter adapter = new SqlDataAdapter(cmd))
{
adapter.SelectCommand.CommandTimeout = 3 * 60;
adapter.Fill(dt);
}
}
}
您需要使用 GroupBy 位置列并连接名字列。
类似
_context.Locs.GroupBy(l => new { l.Location })
.Select(g => new { g.Key.Location , Names = string.Join(",", g.Select(i => i.FirstName)) });
看看this question
如果您的数据不是 Datatable 格式,代码会更简洁。
像这样应该可以解决您的问题
DataTable dt = new DataTable();
dt.Columns.Add("Location");
dt.Columns.Add("First_Name");
dt.Rows.Add("Sydney", "John");
dt.Rows.Add("New York", "Larry");
dt.Rows.Add("Chicago", "Meg");
dt.Rows.Add("Dallas", "Mark");
dt.Rows.Add("Sydney", "Jack");
dt.Rows.Add("Dallas", "Chandler");
dt.Rows.Add("Sydney", "Richard");
var result = dt
.AsEnumerable()
.GroupBy(x => x["Location"])
.Select(group => new
{
Location = group.Key.ToString(),
First_Name = string.Join(",", group.Select(x => x["First_Name"]))
});
已更新
如果您想将匿名类型转换回数据表,您可以查看 Best Practice: Convert LINQ Query result to a DataTable without looping
话虽这么说。我觉得如果你朝这个方向前进,最好以不同的方式完成这项任务。也许写一个存储过程来完成这项工作(1 db 调用 vs 2)
如果您想在 C# 中执行此操作,我会将此解决方案的实现更改为类似这样的内容
DataTable dtResult = new DataTable();
dtResult.Columns.Add("Location");
dtResult.Columns.Add("First_Name");
DataTable dt = dtResult.Clone();
dt.Rows.Add("Sydney", "John");
dt.Rows.Add("New York", "Larry");
dt.Rows.Add("Chicago", "Meg");
dt.Rows.Add("Dallas", "Mark");
dt.Rows.Add("Sydney", "Jack");
dt.Rows.Add("Dallas", "Chandler");
dt.Rows.Add("Sydney", "Richard");
var result = dt.AsEnumerable().GroupBy(x => x["Location"])
.Select(group => dtResult.Rows.Add(group.Key.ToString(),string.Join(",", group.Select(x => x["First_Name"]))));
例如, 如果我有以下数据表,
位置 | 名字 | 密码 | 经理 |
---|---|---|---|
悉尼 | 约翰 | 123 | 布莱恩 |
纽约 | 拉里 | 456 | 雪利酒 |
芝加哥 | 梅格 | 789 | 琳达 |
达拉斯 | 马克 | 012 | 库珀 |
悉尼 | 杰克 | 123 | 布莱恩 |
达拉斯 | 钱德勒 | 012 | 库珀 |
悉尼 | 理查德 | 123 | 布莱恩 |
在这里,要遍历的第一列是位置。 Location 匹配的地方,遍历所有对应的 First Names 并将其保持在逗号分隔的一行中。
位置 | 名字 | 密码 | 经理 |
---|---|---|---|
悉尼 | 约翰、杰克、理查德 | 123 | 布莱恩 |
纽约 | 拉里 | 456 | 雪利酒 |
芝加哥 | 梅格 | 789 | 琳达 |
达拉斯 | 马克,钱德勒 | 012 | 库珀 |
我将其存储在数据表变量 dt 中,如下所示:
DataTable dt = new DataTable();
using (SqlConnection sqlConn = new SqlConnection(ConfigurationManager.AppSettings["connectionString"].ToString()))
{
sqlConn.Open();
using (SqlCommand cmd = new SqlCommand(script, sqlConn))
{
using (SqlDataAdapter adapter = new SqlDataAdapter(cmd))
{
adapter.SelectCommand.CommandTimeout = 3 * 60;
adapter.Fill(dt);
}
}
}
您需要使用 GroupBy 位置列并连接名字列。
类似
_context.Locs.GroupBy(l => new { l.Location })
.Select(g => new { g.Key.Location , Names = string.Join(",", g.Select(i => i.FirstName)) });
看看this question
如果您的数据不是 Datatable 格式,代码会更简洁。
像这样应该可以解决您的问题
DataTable dt = new DataTable();
dt.Columns.Add("Location");
dt.Columns.Add("First_Name");
dt.Rows.Add("Sydney", "John");
dt.Rows.Add("New York", "Larry");
dt.Rows.Add("Chicago", "Meg");
dt.Rows.Add("Dallas", "Mark");
dt.Rows.Add("Sydney", "Jack");
dt.Rows.Add("Dallas", "Chandler");
dt.Rows.Add("Sydney", "Richard");
var result = dt
.AsEnumerable()
.GroupBy(x => x["Location"])
.Select(group => new
{
Location = group.Key.ToString(),
First_Name = string.Join(",", group.Select(x => x["First_Name"]))
});
已更新
如果您想将匿名类型转换回数据表,您可以查看 Best Practice: Convert LINQ Query result to a DataTable without looping
话虽这么说。我觉得如果你朝这个方向前进,最好以不同的方式完成这项任务。也许写一个存储过程来完成这项工作(1 db 调用 vs 2)
如果您想在 C# 中执行此操作,我会将此解决方案的实现更改为类似这样的内容
DataTable dtResult = new DataTable();
dtResult.Columns.Add("Location");
dtResult.Columns.Add("First_Name");
DataTable dt = dtResult.Clone();
dt.Rows.Add("Sydney", "John");
dt.Rows.Add("New York", "Larry");
dt.Rows.Add("Chicago", "Meg");
dt.Rows.Add("Dallas", "Mark");
dt.Rows.Add("Sydney", "Jack");
dt.Rows.Add("Dallas", "Chandler");
dt.Rows.Add("Sydney", "Richard");
var result = dt.AsEnumerable().GroupBy(x => x["Location"])
.Select(group => dtResult.Rows.Add(group.Key.ToString(),string.Join(",", group.Select(x => x["First_Name"]))));