[英]Cross join on two DataTables using 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
,但未能將其轉換為DataTable
。 如何對兩個DataTable
進行交叉DataTable
?
您只需要手動執行:
1)創建結果數據表
2)從兩個表中添加列(請記住,輸入表中的列名稱可能具有保存名稱,因此您需要約定以進行處理-例如包括輸入表名稱或smth)
3)並將值從聯接結果實體復制到相應的列
試試這個
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;
}
我使用了下面對我有用的代碼。 我不得不進一步將q in轉換為數組,然后依次轉換為list和table,因為我無法將q直接轉換為table。 以下是可能對某人有用的代碼。
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;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.