为了账号安全,请及时绑定邮箱和手机立即绑定

如何在没有列名的情况下使用 linq 彻底连接两个数据表

如何在没有列名的情况下使用 linq 彻底连接两个数据表

C#
婷婷同学_ 2021-09-19 16:25:47
这可能在其他地方得到了回答,但我还没有找到可行的解决方案。我有两个数据表,我想将它们连接到一个数据表中,其中包含来自它们两个的所有数据,或者至少来自它们中的第一个和第二个数据表中的一些列。我不想列出第一个数据表中的所有列(总共 180 个)。我试过例如。这个var JoinedResult = from t1 in table1.Rows.Cast<DataRow>()                   join t2 in table2.Rows.Cast<DataRow>()                       on Convert.ToInt32(t1.Field<string>("ProductID")) equals t2.Field<int>("FuelId")                    select t1;但这仅给出了 table1 中的列。如何从 table2 中获取列到我的结果?最后,我需要将我的结果添加到数据集中。ResultSet.Tables.Add(JoinedResult.CopyToDataTable());编辑:我最终以此作为解决方案。这遵循此处给出的示例Create join with Select All (select *) in linq to datasets DataTable dtProduct = dsProduct.Tables[0]; DataTable dtMoistureLimits = ds.Tables[0]; //clone dt1, copies all the columns to newTable  DataTable dtProductWithMoistureLimits = dtProduct.Clone(); //copies all the columns from dt2 to newTable foreach (DataColumn c in dtMoistureLimits.Columns)   dtProductWithMoistureLimits.Columns.Add(c.ColumnName, c.DataType);   var ProductsJoinedWithMoistureLimits = dtProduct.Rows.Cast<DataRow>()       .Join(dtMoistureLimits.Rows.Cast<DataRow>(),// join table1 and table2       t1 => new { ProductID = t1.Field<int>("ProductID"), DelivererID = t1.Field<int>("DelivererID") },       t2 => new { ProductID = t2.Field<int>("MoistureLimits_ProductID"), DelivererID = t2.Field<int>("MoistureLimits_DelivererID") },       (t1, t2) =>     // when they match        {    // make a new object            // containing the matching t1 and t2           DataRow row = dtProductWithMoistureLimits.NewRow();           row.ItemArray = t1.ItemArray.Concat(t2.ItemArray).ToArray();           dtProductWithMoistureLimits.Rows.Add(row);           return row;       });但是,在dtMoistureLimits 中,dtProduct中没有所有“ProductID”和“DelivererID”的行。目前我的解决方案只返回匹配的行。如何改进解决方案以返回那些在dtMoistureLimits 中没有“ProductID”和“DelivererID”数据的行?
查看完整描述

2 回答

?
拉风的咖菲猫

TA贡献1995条经验 获得超2个赞

使用方法语法的解决方案,无需提及所有列


var result = table1.Rows.Cast<DataRow>()

   .Join(table2.Rows.Cast<DataRow>(),                      // join table1 and table2

      t1 => Convert.ToInt32(t1.Field<string>("ProductID")) // from every t1 get the productId

      t2 => t2.Field<int>("FuelId")                        // from every t2 get the fuelId,

      (t1, t2) => new                                  // when they match 

      {                                                // make a new object

           T1 = t1,                                    // containing the matching t1 and t2

           T2 = t2,

      }


查看完整回答
反对 回复 2021-09-19
  • 2 回答
  • 0 关注
  • 184 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信