2013-03-07 35 views
1

我試圖進行內部連接上數據表我有如何循環Linq中的數據表?

我的代碼如下

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桌而我的表的數目是不固定的

能我遍歷表並執行連接。

這是最好的辦法嗎?

請幫助

+3

***我的表的數目是不固定的***:那是什麼意思?請解釋你的應用程序多一點,你最終需要什麼,因爲它感覺像LINQ可能不是正確的答案。 – 2013-03-07 11:48:13

+0

是這個實體框架? – 2013-03-07 11:49:17

+0

我想說的是我有返回多個表的代碼 – Rohit 2013-03-07 11:50:15

回答

1

以下方法使用DataTable列表來解決動態數量的數據表。該代碼產生的List。這個例子假定將被添加到連接中的每個其他數據表的最終項目結構的列值位於相同的位置(在我們的例子中,我使用了row2[1],所以我拿第二個位置)。

[編輯]我還添加了加入多個列的例子/連接表

// 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(); 
    }); 
+0

似乎不工作..結果返回計數= 0 – Rohit 2013-03-07 13:05:41

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 } 
    ); 

不是一個完整的解決方案,但它的思想是我正在解釋。

因此,而不是'硬編碼'查詢1,查詢2等,你可以做同樣的循環一組集合。

聽起來很難,我相信它會成爲的。