【问题标题】:DataTable Join using LINQ in C#在 C# 中使用 LINQ 连接数据表
【发布时间】:2012-03-30 17:17:48
【问题描述】:

我正在以这种方式使用 LINQ 连接两个数据表:

 DataTable targetTable = dataTable1.Clone();
 var dt2Columns = dataTable2.Columns.OfType<DataColumn>().Select(dc =>
        new DataColumn(dc.ColumnName, dc.DataType, dc.Expression, dc.ColumnMapping));
 var dt2FinalColumns = from dc in dt2Columns.AsEnumerable()
                       where targetTable.Columns.Contains(dc.ColumnName) == false
                       select dc;
 targetTable.Columns.AddRange(dt2FinalColumns.ToArray());

 var rowData = from row1 in dataTable1.AsEnumerable()
               join row2 in dataTable2.AsEnumerable()
               on row1.Field<string>("keyCol") equals row2.Field<string>("keyCol")
               select row1.ItemArray.Concat(row2.ItemArray.Where(r2 => row1.ItemArray.Contains(r2) == false)).ToArray();
 foreach (object[] values in rowData)
     targetTable.Rows.Add(values);

我在这里面临三个问题:

  1. 如果两个表的行数不同,我想传递默认值或为其他表中未找到的值分配空字符串。我该如何做到这一点?
  2. 如果我有多个列并且需要与 AND 进行比较,这怎么可能?
  3. 如果我必须在运行时连接多个表怎么办。有什么方法可以生成动态 LINQ 吗?

【问题讨论】:

  • 是否有特定原因要使用 LINQ 而不是使用 DataTable.Merge()?
  • 这些表的架构不同。我想从这些表中创建一个巨大的交叉连接表。我想根据这些表之间的公共列加入它们。
  • 看起来你想要类似于外连接的东西,使用 DefaultIfEmpty geekswithblogs.net/AzamSharp/archive/2008/04/07/121103.aspx
  • @habib.osu 在您的示例中,这是可能的,因为用户知道两个表的列。我想要达到的目标每次都会有不同的表格。就我而言,我不知道如何选择新行并将默认值应用于列。
  • @buffer_overflow:如果合并对您不起作用,请查看这个看起来很有希望的答案:stackoverflow.com/a/5260993/284240

标签: c# linq join datatable


【解决方案1】:

如果两个表具有相同的主键 DataTable.Merge 将起作用:

dataTable1.Merge(dataTable2 ,false, MissingSchemaAction.Add);

这将合并两个表的架构(列),连接具有相同主键的行并添加其他行。

【讨论】:

  • 合并不会给我我正在寻找的输出。原因是当我应用连接表的主键时,我得到了唯一的行。但我需要的是所有行。
猜你喜欢
  • 1970-01-01
  • 2016-03-04
  • 2014-04-05
  • 2018-05-24
  • 1970-01-01
  • 1970-01-01
  • 2013-04-24
  • 1970-01-01
  • 2015-06-27
相关资源
最近更新 更多