2012-11-29 88 views
1

在兩個表上進行交叉連接時遇到問題。這裏是我的代碼:使用LINQ交叉連接兩個DataTable使用LINQ

public DataTable JoinTable(DataTable piTable1, DataTable piTable2) 
{ 
    if (piTable1 == null || piTable2 == null) 
     return new DataTable(); 

    var joinResult = from parent in piTable1.Rows.Cast<DataRow>() 
        from child in piTable2.Rows.Cast<DataRow>() 
        select new {parent, child}; 

    return joinResult.CopyToDataTable(); 
} 

我得到的結果作爲兩個DataRowCollection S,但它未能將其轉化爲DataTable。我如何在兩個DataTable上進行交叉連接?

+0

加入例子:http://code.msdn.microsoft.com/LINQ-Join-Operators-dabef4e9 – Aristos

+0

喜它是一個很好的例子,但我的問題是表列我會知道僅在運行。所以我不能檢查任何條件 – user1557020

回答

0

你只需要手工進行:
1)創建結果的DataTable
2)兩個表中添加列(記住,在輸入表的列名稱可能有保存的名字,所以你需要約定處理在於 - 等包括輸入表名稱或不服)
3)和從聯接結果實體值複製到對應的列

+0

任何示例代碼請... – user1557020

0

嘗試這樣

public DataTable JoinTable(DataTable piTable1, DataTable piTable2) 
{ 
    DataTable JoinTable = new DataTable(); 

    if (piTable1 == null || piTable2 == null) 
     return new DataTable(); 

    var q = from parent in piTable1.AsEnumerable() 
        from child in piTable2.AsEnumerable() 
        select new 
        {              
         property1 = parent.Field<T>("PropertyName1"), 
         property2 = parent.Field<T>("PropertyName2"), 
         property3 = child.Field<T>("PropertyName3"), 
         property4 = child.Field<T>("PropertyName4") 
        }; 

    JoinTable.Rows.Add(q); 
    return JoinTable; 
} 
0

我已經使用低於該藉機代碼d對我來說。我不得不進一步將q轉換爲數組,然後列出然後表格,因爲我無法將q直接轉換爲表格。以下是可能有助於某人的代碼。

public DataTable JoinTable(DataTable piTable1, string table1Column, 
DataTable piTable2, string table2Column) 
{ 
    DataTable JoinTable = new DataTable(); 
    JoinTable.Columns.Add(table1Column); 
    JoinTable.Columns.Add(table2Column); 

     if (piTable1 == null || piTable2 == null) 
      return new DataTable(); 

     var q = from parent in piTable1.AsEnumerable() 
       from child in piTable2.AsEnumerable() 
       select new 
       { 
        table1Column = parent.Field<string>(table1Column), 
        table1Column = child.Field<string>(table2Column), 
       }; 

     JoinTable = ToDataTable((q.ToArray()).ToList()); 
     JoinTable.TableName = "ResultTable"; 

     return JoinTable; 

    } 

    public DataTable ToDataTable<T>(List<T> items) 
    { 
     DataTable dataTable = new DataTable(typeof(T).Name); 
     //Get all the properties 
     PropertyInfo[] Props = typeof(T).GetProperties(BindingFlags.Public | BindingFlags.Instance); 
     foreach (PropertyInfo prop in Props) 
     { 
      //Setting column names as Property names 
      dataTable.Columns.Add(prop.Name); 
     } 
     foreach (T item in items) 

     { 
      var values = new object[Props.Length]; 
      for (int i = 0; i < Props.Length; i++) 
      { 
       //inserting property values to datatable rows 
       values[i] = Props[i].GetValue(item, null); 
      } 
      dataTable.Rows.Add(values); 
     } 
     //put a breakpoint here and check datatable 
     return dataTable; 
    }