组合从DataSet.ReadXML获得的DataTable

时间:2015-01-05 20:01:34

标签: c# xml linq datagridview ado.net

我有一个DataGridView,我想填充从XML文件读取的数据,我从网络文件夹中读取。这些XML文件具有不同的模式,其中最复杂的模式类似于以下结构。

  

订单(属性1)

     
    

订单(属性2)(属性3)

         
      

             
        

行号         零件号         序列号

      
    
  

通过FileInfo.OpenText,XmlReader.Create和DataSet.ReadXML的组合将此数据读入内存。当DataSet.ReadXML执行时,我返回一个DataSet对象(名为“xmlContents”),其中包含三个DataTables:Orders,Order和Line。我希望将此数据绑定到我正在创建的Windows窗体应用程序中的单个DataGridView。

当我尝试将数据表合并在一起时,使用以下方法,我得到一个Null Reference Exception。

foreach (DataTable dt in xmlContents.Tables)
            {
                if (onFirstTable)
                {
                    mergedTable = dt.Clone();
                    onFirstTable = false;
                }
                else
                {
                    mergedTable.Merge(dt);
                }
            }

我已经检查了,并且三个不同的表之间存在ARE DataRelations。但是,列是系统生成的。有没有办法,也许使用LINQ,我可以返回一个DataSet,将这三个表中的数据合并为一个DataTable?我想以通用的方式做到这一点,而不必编写LINQ,如

from x join y join z select x.Attribute1, y.Attribute2, y.Attribute3, z.LineNumber, z.PartNumber, z.SerialNumber

因为不同的文件具有不同的模式,并且我不知道系统生成的主键在构建时的名称。


编辑:我在确定了ystem生成的PK对于我的表之后,已经实现了LINQ查询。

IEnumerable<DataRow> query = 
                (from rpos in xmlContents.Tables[0].AsEnumerable()
                join rpo in xmlContents.Tables[1].AsEnumerable()
                    on rpos.Field<object>("RPOs_Id") equals rpo.Field<object>("RPOs_Id")
                join line in xmlContents.Tables[2].AsEnumerable()
                    on rpo.Field<object>("RPO_Id") equals line.Field<object>("RPO_Id")
                select new { rpos, rpo, line }).Cast<DataRow>();

但是,在运行应用程序时,我收到以下错误:

  

无法将类型为'&lt;&gt; f__AnonymousType1`3 [System.Data.DataRow,System.Data.DataRow,System.Data.DataRow]'的对象强制转换为'System.Data.DataRow'。

1 个答案:

答案 0 :(得分:0)

这是两张桌子,但您应该可以将它扩展为三张(采取宝贝步骤!):

//Create source tables
DataTable dt1 = new DataTable("Employees");
dt1.Columns.Add("EmployeeID", Type.GetType("System.Int32"));
dt1.Columns.Add("FirstName", Type.GetType("System.String"));
dt1.Columns.Add("LastName", Type.GetType("System.String"));
dt1.Columns.Add("BirthDate", Type.GetType("System.DateTime"));
dt1.Columns.Add("JobTitle", Type.GetType("System.String"));
dt1.Columns.Add("DepartmentID", Type.GetType("System.Int32"));
dt1.Rows.Add(new object[] { 1, "Tommy", "Hill", new DateTime(1970, 12, 31), "Manager", 42 });
dt1.Rows.Add(new object[] { 2, "Brooke", "Sheals", new DateTime(1977, 12, 31), "Manager", 23 });
dt1.Rows.Add(new object[] { 3, "Bill", "Blast", new DateTime(1982, 5, 6), "Sales Clerk", 42 });
dt1.Rows.Add(new object[] { 1, "Kevin", "Kline", new DateTime(1978, 5, 13), "Sales Clerk", 42 });
dt1.Rows.Add(new object[] { 1, "Martha", "Seward", new DateTime(1976, 7, 4), "Sales Clerk", 23 });
dt1.Rows.Add(new object[] { 1, "Dora", "Smith", new DateTime(1985, 10, 22), "Trainee", 42 });
dt1.Rows.Add(new object[] { 1, "Elvis", "Pressman", new DateTime(1972, 11, 5), "Manager", 15 });
dt1.Rows.Add(new object[] { 1, "Johnny", "Cache", new DateTime(1984, 1, 23), "Sales Clerk", 15 });
dt1.Rows.Add(new object[] { 1, "Jean", "Hill", new DateTime(1979, 4, 14), "Sales Clerk", 42 });
dt1.Rows.Add(new object[] { 1, "Anna", "Smith", new DateTime(1985, 6, 26), "Trainee", 15 });

DataTable dt2 = new DataTable("Departments");
dt2.Columns.Add("DepartmentID", Type.GetType("System.Int32"));
dt2.Columns.Add("DepartmentName", Type.GetType("System.String"));
dt2.Rows.Add(new object[] { 15, "Men's Clothing" });
dt2.Rows.Add(new object[] { 23, "Women's Clothing" });
dt2.Rows.Add(new object[] { 42, "Children's Clothing" });

var JoinedTables = from t1 in dt1.AsEnumerable()
                    join t2 in dt2.AsEnumerable() on t1["DepartmentID"] equals t2["DepartmentID"]
                    select new {
                        LastName = t1.Field<String>("LastName"),
                        DepartmentName = t2.Field<String>("DepartmentName")
                    };

GridView1.DataSource = JoinedTables;
GridView1.DataBind();