gpt4 book ai didi

c# - 遍历多个数据表(共享同一列)

转载 作者:行者123 更新时间:2023-11-30 23:25:42 26 4
gpt4 key购买 nike

我有例如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");
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”列连接的关系?我想只用一个循环遍历所有行。

我已经阅读了 'Adding DataRelations ' 在 MSDN 站点上,但我无法定义具有相同名称的多个关系。

最佳答案

我认为对您的问题的简短回答是“不,没有一种方法可以通过使用 DataRelation 类或一组类的一个循环遍历所有相关表中的所有行”。

DataRelation 类的设计 [据我所知] 是为了在代码中提供通常在数据库级别强制执行的约束,例如主键 -> 外键关系。但是,它并非真正设计用于轻松遍历数据 - 也就是说,数据访问需要了解底层数据结构(表/列)。

有多种方法可以通过单个循环收集数据,但我不确定这样的数据收集有多大意义。这是一个使用 Dictionary<int, List<Tuple<string, object>>> 的示例,其中键是表中的主键,数据分组为列名/值对:

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

上述代码的优点是完全不依赖表结构(除了明显需要识别主表和主键);但您仍然需要编写大量代码才能有意义地解析生成的数据结构。

我认为在这种情况下,LINQ 查询会更加清晰和表达。我知道这不是您要的,但以防万一您感兴趣,这里有一个 LINQ 解决方案,它提供了等效于数据的“SQL View ”,表示为 [在我看来] 有意义的对象的可枚举:

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

关于c# - 遍历多个数据表(共享同一列),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37122432/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com