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"]))));