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;
}
}