C# 循环多个数据表(共享同一列)
例如,我有4个数据表:C# 循环多个数据表(共享同一列),c#,datatable,C#,Datatable,例如,我有4个数据表: private void Test() { DataTable table1 = new DataTable(); table1.Columns.Add("MyId"); table1.Columns.Add("Column1"); table1.Columns.Add("Column2"); DataTable table2 = new DataTable(); table2.Columns.Add("Column3")
private void Test()
{
DataTable table1 = new DataTable();
table1.Columns.Add("MyId");
table1.Columns.Add("Column1");
table1.Columns.Add("Column2");
DataTable table2 = new DataTable();
table2.Columns.Add("Column3");
table2.Columns.Add("MyId");
table2.Columns.Add("Column4");
DataTable table3 = new DataTable();
table3.Columns.Add("Column5");
table3.Columns.Add("MyId");
table3.Columns.Add("Column6");
DataTable table4 = new DataTable();
table4.Columns.Add("Column7");
table4.Columns.Add("Column8");
table4.Columns.Add("MyId");
DataSet set = new DataSet();
set.Tables.Add(table1);
set.Tables.Add(table2);
set.Tables.Add(table3);
set.Tables.Add(table4);
set.Relations.Add("MYKEY", table1.Columns["MyId"], table2.Columns["MyId"]);
set.Relations.Add("MYKEY", table1.Columns["MyId"], table3.Columns["MyId"]);
set.Relations.Add("MYKEY", table1.Columns["MyId"], table4.Columns["MyId"]);
foreach (DataTable dt in set.Tables)
{
foreach (DataRow item in dt.Rows[0].GetChildRows("MYKEY"))
{
int id = Convert.ToInt32(item["MyId"]);
string column1 = item["Column1"].ToString();
string column8 = item["Column8"].ToString();
}
}
}
是否可以实现一种关系,其中所有数据表都是基于“MyId”列连接的?我想用一个循环遍历所有行
我已经在MSDN站点上读到了,但是我不能用同一个名称定义多个关系。我想你的问题的简短答案是“不,没有一种方法可以使用
DataRelation
类或其一组来循环所有相关表中的所有行”
DataRelation类的设计[据我所知]是为了在代码中提供通常在数据库级别强制执行的约束,例如主键->外键关系。但是,它的设计并不是为了方便地遍历数据——也就是说,数据访问需要了解底层数据结构(表/列)
有很多方法可以通过单个循环收集数据,但我不确定这样的数据收集会有多大意义。下面是一个使用字典的示例,其中键是表中的主键,数据分组为列名/值对:
var data = new Dictionary<int, List<Tuple<string, object>>>();
foreach (DataRow row in table1.Rows)
{
/* Pull data from "main" table */
int id = Convert.ToInt32(row["MyId"]);
var rowData = new List<Tuple<string, object>>();
foreach (DataColumn column in table1.Columns)
{
string columnName = column.ColumnName;
var columnData = new Tuple<string, object>(columnName, row[columnName]);
rowData.Add(columnData);
}
//Collect data from each related table
foreach (DataRelation relation in set.Relations)
{
foreach (DataRow relatedRow in row.GetChildRows(relation))
{
foreach (DataColumn column in relation.ChildTable.Columns)
{
if (relation.ChildColumns.Contains(column))
{
continue;
}
string columnName = column.ColumnName;
var columnData = new Tuple<string, object>(columnName, relatedRow[columnName]);
rowData.Add(columnData);
}
}
}
//Add to data dictionary
data.Add(id, rowData);
}
var fullDataView = from t1data in table1.AsEnumerable()
join t2data in table2.AsEnumerable()
on t1data["MyId"] equals t2data["MyId"]
join t3data in table3.AsEnumerable()
on t1data["MyId"] equals t3data["MyId"]
join t4data in table4.AsEnumerable()
on t1data["MyId"] equals t4data["MyId"]
select new
{
MyId = t1data["MyId"],
Column1 = t1data["Column1"],
Column2 = t1data["Column2"],
Column3 = t2data["Column3"],
Column4 = t2data["Column4"],
Column5 = t3data["Column5"],
Column6 = t3data["Column6"],
Column7 = t4data["Column7"],
Column8 = t4data["Column8"]
};