3

私が持っているデータテーブルで内部結合を実行しようとしています

私のコードは次のとおりです

 var Result = from row1 in t1
              join row2 in t2 on row1.ID equals row2.ID
              join row3 in t3 on row1.ID equals row3.ID
              select new { Emp.ID = row1.ID, Col1 = row2.col1, Col2 = row3.col2 

このスニペットには 3 つのテーブルしかありませんが、テーブルの数は固定されていません

テーブルをループして結合を実行できますか。

それは最善のアプローチでしょうか??

助けてください

4

2 に答える 2

2

次のアプローチでは、DataTableリストを使用して動的な数のデータテーブルに対処します。コードは の を生成しListますIEnumerable<object>。この例では、結合内の他の各データ テーブルの最終項目構造に追加される列値が同じ位置にあると想定しています (この例では を使用row2[1]したため、2 番目の位置をとります)。

[編集]複数の列/結合されたテーブルを結合する例も追加しました

    // create the collection
    List<DataTable> dts = new List<DataTable>();

    // add some test datatables
    for (int i = 0; i < 10; i++)
    {
        var dt = new DataTable();
        dt.TableName = i.ToString();
        dt.Columns.Add("ID");
        dt.Columns.Add("col" + i.ToString());
        dt.Columns.Add("otherCol" + i.ToString());
        dt.Rows.Add(1, "x1" + i.ToString(), DateTime.Now);
        dt.Rows.Add(2, "x2" + i.ToString(), DateTime.Now);
        dts.Add(dt);
    }

    // get the ID column position in the first table
    var idPosition = dts[0].Columns["ID"].Ordinal;

    // used for storing the results
    var results = new List<IEnumerable<object>>();

    // add the columns from the first table
    results = dts[0].AsEnumerable()
        .Select(j => j.ItemArray.AsEnumerable()).ToList();

    // join all tables
    dts.Skip(1).ToList().ForEach((list) =>
    {
        results = results
        .AsEnumerable()
        .Join(
            list.AsEnumerable(),
            x => x.Skip(idPosition).First(),
            x => x["ID"],
            // select the second column
            (row1, row2) => row1.Concat(new[] { row2[1] }))
            // replace the preceding line with 
            // the following one to select the second and the third column
            //(row1, row2) => row1.Concat(new[] { row2[1], row2[2] }))
        .ToList();
    });
于 2013-03-07T12:46:29.160 に答える
1

難しい方法と呼ばれる 1 つの方法は、Linq の拡張メソッドを使用して結合の組み合わせを構築することです。このようにして、コレクション (テーブル) をループし、必要に応じて追加できます。

たとえば、これは次のとおりです。

from t1 in Table1
join t2 in Table2 on t1.ID equals t2.ID
join t3 in Table3 on t2.ID equals t3.ID
select new { t1, t2, t3 }

次のように書き換えることができます (LinqPad を使用すると簡単に実行できます):

var query = Table1
   .Join (
      Table2, 
      t1 => t1.ID, 
      t2 => t2.ID, 
      (t1, t2) => new  { t1 = t1, t2 = t2 }
   )
   .Join (
      Table3, 
      temp0 => temp0.t2.ID, 
      t3 => t3.ID, 
      (temp0, t3) => new { t1 = temp0.t1, t2 = temp0.t2, t3 = t3 }
   )
;

これは分割することができ、一連のコレクション (t1/t2/t3) をループしながらこれを機能させることができると思います。

var query1 = Table1
   .Join (
      Table2, 
      t1 => t1.ID, 
      t2 => t2.ID, 
      (t1, t2) => new  { t1 = t1, t2 = t2 }
   );
var query2 = query1
   .Join (
      Table3, 
      temp0 => temp0.t2.ID, 
      t3 => t3.ID, 
      (temp0, t3) => new { t1 = temp0.t1, t2 = temp0.t2, t3 = t3 }
   );

完全な解決策ではありませんが、説明しようとしているのはその考えです。

そのため、query1、query2 などを「ハードコーディング」する代わりに、一連のコレクションをループしながら同じことを行うことができます。

難しそうですが、きっとそうなるでしょう。

于 2013-03-07T12:45:28.680 に答える