2017-02-15 67 views
0

我有两个DataTable dt_original和dt_updated。我想合并它们在一起 与一个条件,如何才能合并行,只有当dt_updated具有相同的item_id与dt_orignal?如何合并两个DataTable的条件

dt_original: -

item_id|item_name|qty|unitprice|col1|col2|col3| 
=============================================== 
1  |apple |5 |1.00  |xxx |xxx |xxx | 
2  |orange |10 |2.00  |xxx |xxx |xxx | 

dt_updated: -

item_id|item_name|qty| 
====================== 
1  |apple |2 | 

结果,我想: -

item_id|item_name|qty|unitprice|col1|col2|col3| 
=============================================== 
1  |apple |2 |1.00  |xxx |xxx |xxx | 

mycode的:

Dim dt_original As DataTable = Model_Query(str_tableControl1) 
Dim dt_result As DataTable 

dt_original.PrimaryKey = New DataColumn() {dt_original.Columns("item_id")} 
dt_updated.PrimaryKey = New DataColumn() {dt_updated.Columns("item_id")} 
dt_original.Merge(dt_updated) 
dt_result = dt_original 

MyResult: -

item_id|item_name|qty|unitprice|col1|col2|col3| 
=============================================== 
1  |apple |2 |1.00  |xxx |xxx |xxx | 
2  |orange |10 |2.00  |xxx |xxx |xxx | 

那么如何解决这个问题呢?

+0

所以,其实,你不希望合并。你想更新的行与所有的字段 – Pikoh

+0

@Pikoh,我应该使用哪个函数? – vbnewbie

回答

3

所以你想更新数量字段?我会使用LINQ和一个循环:

Dim updatedRows = From rowOriginal In dt_original.AsEnumerable() 
        Join rowUpdated In dt_updated.AsEnumerable() 
        On rowOriginal.Field(Of Int32)("item_id") Equals rowUpdated.Field(Of Int32)("item_id") 

Dim dt_result As DataTable = dt_original.Clone() ' empty table, same columns 
For Each x In updatedRows 
    dt_result.ImportRow(x.rowOriginal) 
    dt_result.Rows(dt_result.Rows.Count-1).SetField("qty", x.rowUpdated.Field(of int32)("qty")) 
Next 

如果您想更新原始表那就更简单了:

For Each x In updatedRows 
    x.rowOriginal.SetField("qty", x.rowUpdated.Field(of int32)("qty")) 
Next 
+0

非常感谢,这项工作就像一个魅力 – vbnewbie

+0

虽然一个很好的解决方案,使用DataRowExtention类是不必要的(SetField)。当你这样做时,会造成不必要的开销,特别是当你不需要库时。元数据加载器会将此dll存储在内存中,但不会添加任何值。还使用SetField创建更多拆箱问题。它在内部调用一个验证参数的泛型方法,然后使用泛型方法取消DataTable中的对象,此时没有任何价值可以直接更改值,Thinking @Tim Schmelter? – Codexer

+0

@ Zaggler:如果真是微观优化。你正在谈论'if(null == argumentValue)'--check的开销,调用静态扩展方法或装箱/拆箱。除了受支持的可空列之外(当时使用'DBNull.Value'),通用的'Field'方法还增加了安全性:它检查你的类型假设是否正确,并且可以帮助找到对于开发者和客户的差距大于1ms。 –