C# 如果对两列重复检查,如何合并数据库中的行

C# 如果对两列重复检查,如何合并数据库中的行,c#,visual-studio-2010,datatable,C#,Visual Studio 2010,Datatable,我想更新我的数据表,并合并用户名和服务器名重复的行 我希望所有行保持相同,只需合并LearningGroups列即可 请参阅附件中的图片,以便更好地理解: 正如您所看到的,前两行是相同的,因此我希望他们将其设置为1,并添加学习组 我在这里看到了许多示例,但我无法根据需要更改它,因为我需要使用两列ServeName、Username和concatatite string column LearningGroup进行筛选 非常感谢您的帮助 更新 在这里找到了一个可能的解决方案: var res

我想更新我的
数据表
,并合并用户名和服务器名重复的行

我希望所有行保持相同,只需合并
LearningGroups
列即可

请参阅附件中的图片,以便更好地理解:

正如您所看到的,前两行是相同的,因此我希望他们将其设置为1,并添加学习组

我在这里看到了许多示例,但我无法根据需要更改它,因为我需要使用两列
ServeName、Username
和concatatite string column LearningGroup进行筛选

非常感谢您的帮助

更新

在这里找到了一个可能的解决方案:

  var result = report.AsEnumerable()
        .GroupBy(r => new
        {
            Version = r.Field<String>("f_username"),
            Col1 = r.Field<String>("servername"),

        })
        .Select(g =>
        {
            var row = g.First();
         //   row.SetField("LearningGroupName", g.Concat(r => r.Field<string>("LearningGroupName"))); 
            return row;
        }).CopyToDataTable();
var result=report.AsEnumerable()
.GroupBy(r=>new
{
Version=r.Field(“f_用户名”),
Col1=r.Field(“服务器名”),
})
.选择(g=>
{
var row=g.First();
//row.SetField(“LearningGroupName”,g.Concat(r=>r.Field(“LearningGroupName”));
返回行;
}).CopyToDataTable();

但是它返回新的一行,第一行LearningGroupName是空的,正如我在这一行中所评论的,它的给定错误是添加列值,因此不确定如何将其更改为concatatite?

您需要手动执行此操作,方法是循环遍历DataTable的每个DataRow,检查前一行,并决定是将该行添加到新DataTable,还是合并

DataTable _newTable = new DataTable();

foreach(DataRow _row in _dataTable) {

}
或者更改基础数据以修复问题,或者使用SQL执行此操作。我会用C#或修复数据。

试试这个:

简单类:

class Foo
{
    public string ServerName { get; set; }
    public string UserName { get; set; }
    public string LearningGroup { get; set; }
}
样本数据的初始化:

List<Foo> _source = new List<Foo> 
        {
            new Foo { ServerName ="ServA", UserName = "John", LearningGroup ="First Group" },
            new Foo { ServerName ="ServA", UserName = "Kate", LearningGroup ="First Group" },
            new Foo { ServerName ="ServA", UserName = "John" },
            new Foo { ServerName ="ServB", UserName = "Kate", },
            new Foo { ServerName ="ServB", UserName = "Kate", LearningGroup ="Second Group" }
        };
数据表解决方案:

DataTable dt = new DataTable();
dt.Columns.Add("ServerName", typeof(string));
dt.Columns.Add("UserName", typeof(string));
dt.Columns.Add("LearningGroup", typeof(string));

dt.Rows.Add("ServA", "John", "First Group");
dt.Rows.Add("ServA", "Kate", "First Group");
dt.Rows.Add("ServA", "John", null);
dt.Rows.Add("ServB", "Kate", null);
dt.Rows.Add("ServB", "Kate", "Second Group");

var tmpDT = (from x in dt.AsEnumerable()
             join f in dt.AsEnumerable() on new { UserName = x.Field<String>("UserName"), ServerName = x.Field<String>("ServerName") } equals new { UserName = f.Field<String>("UserName"), ServerName = f.Field<String>("ServerName") }
             where !string.IsNullOrEmpty(x.Field<String>("LearningGroup"))
             select x).Distinct();

我不能100%确定你需要的输出是什么,但你可能想把重复的学生分组,并把他们的课程和导师联系起来

一个完整的工作示例:

class Program
{
    static void Main(string[] args)
    {
        // setup dummy DataTable
        var tbl = new DataTable();

        tbl.Columns.Add("id", typeof(Int32));
        tbl.Columns.Add("learningGroup", typeof(String));
        tbl.Columns.Add("tutor", typeof(String));

        tbl.Rows.Add(1, "", "");
        tbl.Rows.Add(1, "group 1", "sam");
        tbl.Rows.Add(2, "group 1", "john");
        tbl.Rows.Add(3, "group 2", "paul");

        tbl = Group(tbl);

        // print DataTable
        foreach (DataRow row in tbl.Rows)
        {
            foreach (var item in row.ItemArray)
            {
                Console.Write(item+"|");
            }
            Console.WriteLine();
        }

        Console.Read();
    }

    // Group-Concat learningGroup and 
    // tutor copying to new DataTable
    static DataTable Group(DataTable tbl)
    {
        var groups = tbl.AsEnumerable()
                        .GroupBy(r => r.Field<Int32>("id"))
                        .Select(g => new {
                                            id = g.Key,
                                            learningGroup = string.Join(",", g.Select(s => s["learningGroup"])).TrimStart(','),
                                            tutor = string.Join(",", g.Select(s => s["tutor"])).TrimStart(','),
                                         });

        var newtbl = new DataTable();

        newtbl.Columns.Add("id", typeof(Int32));
        newtbl.Columns.Add("learningGroup", typeof(String));
        newtbl.Columns.Add("tutor", typeof(String));

        foreach (var g in groups)
        {
            newtbl.Rows.Add(g.id, g.learningGroup, g.tutor);
        }

        return newtbl;
    }
}
类程序
{
静态void Main(字符串[]参数)
{
//设置虚拟数据表
var tbl=新数据表();
tbl.列。添加(“id”,类型(Int32));
tbl.Columns.Add(“learningGroup”,typeof(String));
tbl.Columns.Add(“导师”,类型(字符串));
添加(1,“,”);
增加(1,“第1组”、“sam”);
增加(2,“第1组”、“约翰”);
增加(3,“第2组”、“保罗”);
tbl=组(tbl);
//打印数据表
foreach(tbl.Rows中的数据行)
{
foreach(row.ItemArray中的var项)
{
控制台。写入(项+“|”);
}
Console.WriteLine();
}
Console.Read();
}
//组Concat Learning组和
//指导复制到新数据表
静态数据表组(数据表tbl)
{
变量组=tbl.AsEnumerable()
.GroupBy(r=>r.Field(“id”))
.选择(g=>new{
id=g.键,
learningGroup=string.Join(“,”,g.Select(s=>s[“learningGroup”]).TrimStart(“,”),
tutor=string.Join(“,”,g.Select(s=>s[“tutor”]).TrimStart(“,”),
});
var newtbl=新数据表();
添加(“id”,typeof(Int32));
newtbl.Columns.Add(“learningGroup”,typeof(String));
newtbl.Columns.Add(“tutor”,typeof(String));
foreach(组中的变量g)
{
newtbl.Rows.Add(g.id,g.learningGroup,g.tutor);
}
返回新BL;
}
}

您用来检索数据的代码是什么?@TI这是一个很长的查询,4个表之间有连接,所以我不想弄乱它,我想在我拥有上述数据库后再做。我正在使用DataTable。可以修改上面的代码来处理吗?@confusedMind再次检查我的答案:)谢谢,但我发现这有点困难实现,以便我可以尝试iefpw发布的简单想法。如何将tmpDT转换回DataTable|@困惑的头脑再一次检查我的答案:)
DataTable newDT = new DataTable();
newDT.Columns.Add("ServerName", typeof(string));
newDT.Columns.Add("UserName", typeof(string));
newDT.Columns.Add("LearningGroup", typeof(string));

foreach (var item in tmpDT)
{
    newDT.ImportRow(item);
}
class Program
{
    static void Main(string[] args)
    {
        // setup dummy DataTable
        var tbl = new DataTable();

        tbl.Columns.Add("id", typeof(Int32));
        tbl.Columns.Add("learningGroup", typeof(String));
        tbl.Columns.Add("tutor", typeof(String));

        tbl.Rows.Add(1, "", "");
        tbl.Rows.Add(1, "group 1", "sam");
        tbl.Rows.Add(2, "group 1", "john");
        tbl.Rows.Add(3, "group 2", "paul");

        tbl = Group(tbl);

        // print DataTable
        foreach (DataRow row in tbl.Rows)
        {
            foreach (var item in row.ItemArray)
            {
                Console.Write(item+"|");
            }
            Console.WriteLine();
        }

        Console.Read();
    }

    // Group-Concat learningGroup and 
    // tutor copying to new DataTable
    static DataTable Group(DataTable tbl)
    {
        var groups = tbl.AsEnumerable()
                        .GroupBy(r => r.Field<Int32>("id"))
                        .Select(g => new {
                                            id = g.Key,
                                            learningGroup = string.Join(",", g.Select(s => s["learningGroup"])).TrimStart(','),
                                            tutor = string.Join(",", g.Select(s => s["tutor"])).TrimStart(','),
                                         });

        var newtbl = new DataTable();

        newtbl.Columns.Add("id", typeof(Int32));
        newtbl.Columns.Add("learningGroup", typeof(String));
        newtbl.Columns.Add("tutor", typeof(String));

        foreach (var g in groups)
        {
            newtbl.Rows.Add(g.id, g.learningGroup, g.tutor);
        }

        return newtbl;
    }
}