2012-04-17 75 views
0

我有3数据表填充数据集和表适配器/绑定源,我需要运行一个Join查询或找到另一种方式来获取特定的数据。 (该数据集包含列出的每个表)DataTable加入或合并

表:

产品表:

Prod_ID Name  

1   tv 
2   couch 

消费者表:

Con_Id Name City 
---------------------- 
1   Gray New York 
2   Joe  Chicago 
3   Steve Madison 

交易表

Tran_Id Con_ID Prod_ID Price 
------------------------------------- 
1   2   1   900 
2   1   2   300 

给定产品我需要填写每个不同城市的表格和该产品在该城市销售多少的名称(将该产品的所有价格添加到给定城市中的任何消费者)

我真的很难过,找不到方法。 (我已经尝试了很多) 请帮助,谢谢!

Nudiers接近至今:

  DataRelation relation = null; 
      DataColumn table1Column = null; 
      DataColumn table2Column = null; 
      DataColumn table3Column = null; 

      table1Column = tlobergeDataSet.Tb_Product.Columns[0]; 
      table2Column = tlobergeDataSet.Tb_Transactions.Columns[3]; 
      table3Column = tlobergeDataSet.Tb_Consumer.Columns[0]; 

      relation = new DataRelation("relation", table1Column, table2Column); 
      tlobergeDataSet.Relations.Add(relation); 
+0

这是拉斯tpart到我的家庭作业。我已经尝试创建3维数组并填充数据,所以没有重复,我试图在每个表上运行select语句来返回正确的信息(无法找到如何添加值)。老师说可以使用linq轻松完成,但我不熟悉它,我也无法让它工作。 – 2012-04-17 15:55:33

+1

您是否尝试过数据集对象的关系属性? – 2012-04-17 15:56:53

+0

首先查看http://code.msdn.microsoft.com/101-LINQ-Samples-3fb9811b并尝试创建自己的代码。发布你的代码,如果你仍然有问题,我们可以帮助你识别出错的地方。 – JamieSee 2012-04-17 16:01:41

回答

0

在LINQ,你可以加入表来找到你想要的语法像这样的数据:

from a in keyTable 
join b in anotherTable on a.Key equals b.Key 
join c in aThirdTable on a.Key equals c.Key 
select new 
{ 
    // Anonymous Object Properties using identifier a, b, and c to get data 
}; 

您应该能够采取这一片段并生成一个linq查询,该查询将生成一个包含您需要的特定数据表示的匿名对象。

+0

a,b和c是列吗?我将如何去选择与他们的价格相加的不同城市?谢谢! – 2012-04-17 16:23:26

0

试试这个。

DataRelation relation = null; 
DataColumn table1Column = null; 
DataColumn table2Column = null; 
//retrieve column 
table1Column = ds.Tables("Table1").Columns(0); 
table2Column = ds.Tables("table2").Columns(0); 
//relating tables 
relation = new DataRelation("relation", table1Column, table2Column); 
//assign relation to dataset 
ds.Relations.Add(relation); 
+0

是否可以将关系添加到3个表格?我如何从这里访问数据? – 2012-04-17 16:20:15

+0

*我用我迄今为止所得到的更新了 – 2012-04-17 16:22:24

0

您可以仅涉及两个表的DataRelation对象,并从 访问数据的数据集是直截了当的,因为数据已经被相关。

 DataRelation relation = null; 
     DataColumn table1Column = null; 
     DataColumn table2Column = null; 
     DataColumn table3Column = null; 

     table1Column = tlobergeDataSet.Tb_Product.Columns[0]; 
     table2Column = tlobergeDataSet.Tb_Transactions.Columns[2]; 
     table2Column1 = tlobergeDataSet.Tb_Transactions.Columns[1]; 
     table3Column = tlobergeDataSet.Tb_Consumer.Columns[0]; 

     relation = new DataRelation("relation", table1Column, table2Column); 
     tlobergeDataSet.Relations.Add(relation); 

     relation = new DataRelation("relation1", table3Column , table2Column1); 
     tlobergeDataSet.Relations.Add(relation); 
+0

谢谢谢谢!现在有可能使用linq来选择不同的行,但同时添加Price行吗?或者我将不得不创建一个方法? – 2012-04-17 17:09:33

2
public DataTable MergeTables(DataTable dtFirst, DataTable dtSecond, string CommonColumn) 
    { 
     DataTable dtResults = dtFirst.Clone(); 
     int count = 0; 
     for (int i = 0; i < dtSecond.Columns.Count; i++) 
     { 
      if (!dtFirst.Columns.Contains(dtSecond.Columns[i].ColumnName)) 
      { 
       dtResults.Columns.Add(dtSecond.Columns[i].ColumnName, dtSecond.Columns[i].DataType); 
       count++; 
      } 
     } 

     DataColumn[] columns = new DataColumn[count]; 
     int j = 0; 
     for (int i = 0; i < dtSecond.Columns.Count; i++) 
     { 
      if (!dtFirst.Columns.Contains(dtSecond.Columns[i].ColumnName)) 
      { 
       columns[j++] = new DataColumn(dtSecond.Columns[i].ColumnName, dtSecond.Columns[i].DataType); 
      } 
     } 

     dtResults.BeginLoadData(); 
     foreach (DataRow dr in dtFirst.Rows) 
     { 
      dtResults.Rows.Add(dr.ItemArray); 
     } 
     foreach (DataRow dr in dtSecond.Rows) 
     { 
      foreach (DataRow dr1 in dtResults.Rows) 
      { 
       if (dr1[CommonColumn].ToString().Equals(dr[CommonColumn].ToString())) 
       { 
        foreach (DataColumn c in columns) 
        { 
         dr1[c.ColumnName] = dr[c.ColumnName]; 
        } 
       } 
      } 
     } 
     dtResults.EndLoadData(); 
     return dtResults; 
    }