猿问

C#中DataTables的内部联接

C#中DataTables的内部联接

设T1和T2是DataTable以下字段

T1(CustID, ColX, ColY)T2(CustID, ColZ)

我需要联合表

TJ (CustID, ColX, ColY, ColZ)

如何在C#代码中以简单的方式完成此操作?谢谢。



慕标琳琳
浏览 723回答 3
3回答

繁花不似锦

如果允许使用LINQ,请查看以下示例。它创建两个带有整数列的DataTables,用一些记录填充它们,使用LINQ查询连接它们并将它们输出到Console。&nbsp; &nbsp; DataTable dt1 = new DataTable();&nbsp; &nbsp; dt1.Columns.Add("CustID", typeof(int));&nbsp; &nbsp; dt1.Columns.Add("ColX", typeof(int));&nbsp; &nbsp; dt1.Columns.Add("ColY", typeof(int));&nbsp; &nbsp; DataTable dt2 = new DataTable();&nbsp; &nbsp; dt2.Columns.Add("CustID", typeof(int));&nbsp; &nbsp; dt2.Columns.Add("ColZ", typeof(int));&nbsp; &nbsp; for (int i = 1; i <= 5; i++)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; DataRow row = dt1.NewRow();&nbsp; &nbsp; &nbsp; &nbsp; row["CustID"] = i;&nbsp; &nbsp; &nbsp; &nbsp; row["ColX"] = 10 + i;&nbsp; &nbsp; &nbsp; &nbsp; row["ColY"] = 20 + i;&nbsp; &nbsp; &nbsp; &nbsp; dt1.Rows.Add(row);&nbsp; &nbsp; &nbsp; &nbsp; row = dt2.NewRow();&nbsp; &nbsp; &nbsp; &nbsp; row["CustID"] = i;&nbsp; &nbsp; &nbsp; &nbsp; row["ColZ"] = 30 + i;&nbsp; &nbsp; &nbsp; &nbsp; dt2.Rows.Add(row);&nbsp; &nbsp; }&nbsp; &nbsp; var results = from table1 in dt1.AsEnumerable()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;join table2 in dt2.AsEnumerable() on (int)table1["CustID"] equals (int)table2["CustID"]&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;select new&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;{&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;CustID = (int)table1["CustID"],&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ColX = (int)table1["ColX"],&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ColY = (int)table1["ColY"],&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ColZ = (int)table2["ColZ"]&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;};&nbsp; &nbsp; foreach (var item in results)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; Console.WriteLine(String.Format("ID = {0}, ColX = {1}, ColY = {2}, ColZ = {3}", item.CustID, item.ColX, item.ColY, item.ColZ));&nbsp; &nbsp; }&nbsp; &nbsp; Console.ReadLine();// Output:// ID = 1, ColX = 11, ColY = 21, ColZ = 31// ID = 2, ColX = 12, ColY = 22, ColZ = 32// ID = 3, ColX = 13, ColY = 23, ColZ = 33// ID = 4, ColX = 14, ColY = 24, ColZ = 34// ID = 5, ColX = 15, ColY = 25, ColZ = 35

动漫人物

我想要一个连接表的函数,而不需要使用匿名类型选择器定义列,但很难找到任何。我最终不得不自己做。希望这将有助于将来搜索此内容的任何人:private&nbsp;DataTable&nbsp;JoinDataTables(DataTable&nbsp;t1,&nbsp;DataTable&nbsp;t2,&nbsp;params&nbsp;Func<DataRow,&nbsp;DataRow,&nbsp;bool>[]&nbsp;joinOn){ &nbsp;&nbsp;&nbsp;&nbsp;DataTable&nbsp;result&nbsp;=&nbsp;new&nbsp;DataTable(); &nbsp;&nbsp;&nbsp;&nbsp;foreach&nbsp;(DataColumn&nbsp;col&nbsp;in&nbsp;t1.Columns) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(result.Columns[col.ColumnName]&nbsp;==&nbsp;null) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result.Columns.Add(col.ColumnName,&nbsp;col.DataType); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;foreach&nbsp;(DataColumn&nbsp;col&nbsp;in&nbsp;t2.Columns) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(result.Columns[col.ColumnName]&nbsp;==&nbsp;null) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result.Columns.Add(col.ColumnName,&nbsp;col.DataType); &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;foreach&nbsp;(DataRow&nbsp;row1&nbsp;in&nbsp;t1.Rows) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;var&nbsp;joinRows&nbsp;=&nbsp;t2.AsEnumerable().Where(row2&nbsp;=> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach&nbsp;(var&nbsp;parameter&nbsp;in&nbsp;joinOn) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;(!parameter(row1,&nbsp;row2))&nbsp;return&nbsp;false; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;true; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach&nbsp;(DataRow&nbsp;fromRow&nbsp;in&nbsp;joinRows) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;DataRow&nbsp;insertRow&nbsp;=&nbsp;result.NewRow(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach&nbsp;(DataColumn&nbsp;col1&nbsp;in&nbsp;t1.Columns) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;insertRow[col1.ColumnName]&nbsp;=&nbsp;row1[col1.ColumnName]; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach&nbsp;(DataColumn&nbsp;col2&nbsp;in&nbsp;t2.Columns) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;insertRow[col2.ColumnName]&nbsp;=&nbsp;fromRow[col2.ColumnName]; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result.Rows.Add(insertRow); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;result;}您可以如何使用此示例:var&nbsp;test&nbsp;=&nbsp;JoinDataTables(transactionInfo,&nbsp;transactionItems, &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(row1,&nbsp;row2)&nbsp;=> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;row1.Field<int>("TransactionID")&nbsp;==&nbsp;row2.Field<int>("TransactionID"));一个警告:这当然没有优化,所以在获得超过20k的行数时要小心。如果您知道一个表将比另一个表大,请尝试将较小的表放在第一个,将较大的表放在第二个表中。

米脂

这是我的代码。不完美,但工作得很好。我希望它对某人有所帮助:&nbsp;&nbsp;&nbsp;&nbsp;static&nbsp;System.Data.DataTable&nbsp;DtTbl&nbsp;(System.Data.DataTable[]&nbsp;dtToJoin) &nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.Data.DataTable&nbsp;dtJoined&nbsp;=&nbsp;new&nbsp;System.Data.DataTable(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach&nbsp;(System.Data.DataColumn&nbsp;dc&nbsp;in&nbsp;dtToJoin[0].Columns) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dtJoined.Columns.Add(dc.ColumnName); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach&nbsp;(System.Data.DataTable&nbsp;dt&nbsp;in&nbsp;dtToJoin) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach&nbsp;(System.Data.DataRow&nbsp;dr1&nbsp;in&nbsp;dt.Rows) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;System.Data.DataRow&nbsp;dr&nbsp;=&nbsp;dtJoined.NewRow(); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;foreach&nbsp;(System.Data.DataColumn&nbsp;dc&nbsp;in&nbsp;dtToJoin[0].Columns) &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dr[dc.ColumnName]&nbsp;=&nbsp;dr1[dc.ColumnName]; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dtJoined.Rows.Add(dr); &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return&nbsp;dtJoined; &nbsp;&nbsp;&nbsp;&nbsp;}
随时随地看视频慕课网APP
我要回答