如何将两个 DataTable 与内部连接连接在一起
Posted
技术标签:
【中文标题】如何将两个 DataTable 与内部连接连接在一起【英文标题】:How to join two DataTable together with inner join 【发布时间】:2015-08-06 09:47:45 【问题描述】:所以我有 2 个数据表,我想以与 sql server 中的内部联接合并的相同方式将它们合并为 1 个。
一个问题是两个表中的某些字段名称相同,但值可能不同(例如定价值)。这两个表都有一个“ID”列,该列具有相同的值并且可以连接。
【问题讨论】:
使用完全限定的列名。 发布一些实际的表格描述(列、类型等),我们可以为您提供更好的帮助。 查看以下网页:code.msdn.microsoft.com/LINQ-Join-Operators-dabef4e9 【参考方案1】:编写一个引用两个数据库中的表的 SQL SELECT 语句,使用 JOIN,为查询中的表分配别名,然后使用别名限定列引用。
并在 SELECT 列表中使用适当的表达式来返回您想要返回的结果集。
【讨论】:
【参考方案2】: DataTable dt1 = new DataTable();
dt1.Columns.Add("CustID", typeof(int));
dt1.Columns.Add("ColX", typeof(int));
dt1.Columns.Add("ColY", typeof(int));
DataTable dt2 = new DataTable();
dt2.Columns.Add("CustID", typeof(int));
dt2.Columns.Add("ColZ", typeof(int));
for (int i = 1; i <= 5; i++)
DataRow row = dt1.NewRow();
row["CustID"] = i;
row["ColX"] = 10 + i;
row["ColY"] = 20 + i;
dt1.Rows.Add(row);
row = dt2.NewRow();
row["CustID"] = i;
row["ColZ"] = 30 + i;
dt2.Rows.Add(row);
var results = from table1 in dt1.AsEnumerable()
join table2 in dt2.AsEnumerable() on (int)table1["CustID"] equals (int)table2["CustID"]
select new
CustID = (int)table1["CustID"],
ColX = (int)table1["ColX"],
ColY = (int)table1["ColY"],
ColZ = (int)table2["ColZ"]
;
foreach (var item in results)
Console.WriteLine(String.Format("ID = 0, ColX = 1, ColY = 2, ColZ = 3", item.CustID, item.ColX, item.ColY, item.ColZ));
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
【讨论】:
这实际上并没有给出一个新的数据表,但却是公认的答案,当已经有一个答案完全做到了这一点,并将结果存储在数据表中时。这是有道理的。【参考方案3】:您可以这样做,假设 table1 和 table2 是您的两个数据表,而 resultTable 是您希望使用连接结果填充的数据表。 您也可以使用 union all 运算符。
【讨论】:
【参考方案4】:编写一个引用两个数据库中的表的 SQL SELECT 语句,使用 JOIN
,为查询中的表分配别名,然后使用别名限定列引用。
并在 SELECT 列表中使用适当的表达式来返回您想要返回的结果集。
要模拟“完全外部”联接,您可能需要使用带有 LEFT JOIN
的查询和带有 ant-join 的另一个查询,并将结果与 UNION ALL
运算符结合起来。
一旦您有一个返回所需结果的 SELECT,您就可以在 INSERT .. SELECT
语句中使用它来将结果保存到另一个表中。
除了对您要达到的目标的模糊描述之外,没有更具体的信息,我们将尽可能具体。
【讨论】:
【参考方案5】:假设table1
和table2
是您的两个数据表,并且resultTable
是您希望使用连接结果填充的DataTable
,您应该能够做到这一点:
var res = from dr1 in table1.AsEnumerable()
join dr2 in table2.AsEnumerable()
on dr1.Field<int>("ID") equals dr2.Field<int>("ID")
select resultTable.LoadDataRow(new object[]
dr1.Field<int>("ID"),
dr1.Field<string>("column name .. "),
...
dr2.Field<string>("column from table 2 .. "),
...
, false);
然后resultTable
将填充您在选择中选择的字段所在的行。
【讨论】:
以上是关于如何将两个 DataTable 与内部连接连接在一起的主要内容,如果未能解决你的问题,请参考以下文章
从两个通过 LINQ 连接的 DataTable 创建组合的 DataTable。 C#