2012-04-17 11 views
0

私は3つのデータテーブルにデータセットとテーブルアダプタ/バインディングソースが設定されているため、結合クエリを実行するか特定のデータを取得する別の方法を見つける必要があります。DataTable JoinまたはMerge

テーブル(データセットは、リストされた各テーブルを含む):

製品表:

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は、これまでのアプローチ:LINQで

  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を使って簡単に行うことができると言いましたが、私はそれに精通していません。 –

+1

データセットオブジェクトのリレーションプロパティを試しましたか? –

+0

まず、http://code.msdn.microsoft.com/101-LINQ-Samples-3fb9811bを見て、独自のコードを作成しようとします。コードを投稿すると、まだ問題がある場合にどこが間違っていたのかを特定するのに役立ちます。 – JamieSee

答えて

0

を、あなたはそうのような構文で必要なデータを見つけるために、テーブルを結合することができます

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は列ですか?そして、私はどのように価格値を合計して別の都市を選択するつもりですか?ありがとう! –

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つのテーブルに関係を追加することは可能ですか?そして、私はここからデータにどのようにアクセスしますか? –

+0

*私はこれまであなたから何を持っているのか更新しました –

0

あなただけのDataRelationオブジェクトに2つのテーブルを関連付けることができ、データがすでに関係しているので、データセットが簡単です からデータにアクセスします。

 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行を同時に追加することは可能ですか?またはメソッドを作成する必要がありますか? –

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; 
    } 
関連する問題