Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 循环多个数据表(共享同一列)_C#_Datatable - Fatal编程技术网

C# 循环多个数据表(共享同一列)

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

例如,我有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”列连接的?我想用一个循环遍历所有行


我已经在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"]
                           };