【问题标题】:How to Merge two DataTable with condition如何合并两个有条件的DataTable
【发布时间】:2017-07-04 02:01:21
【问题描述】:

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

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 |

我的代码:

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

我的结果:-

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 |

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

【问题讨论】:

  • 所以,事实上,你并不想合并。您想要包含所有字段的更新行
  • @Pikoh 我应该使用哪个函数?

标签: vb.net datatable merge


【解决方案1】:

所以你想更新数量字段?我会使用 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

【讨论】:

  • 虽然是一个很好的解决方案,但使用 DataRowExtention 类是不必要的(SetField)。当你这样做时,它会产生不必要的开销,尤其是当你不需要库时。发生的情况是元数据加载器会将这个 dll 存储在内存中,不会增加任何值。使用 SetField 也会产生更多的拆箱问题。它在内部调用一个泛型方法来验证参数,然后使用泛型方法将 DataTable 中的对象拆箱,此时您可以直接更改值,这没有任何价值,Thoughts @Tim Schmelter?
  • @Zaggler:如果这完全是微优化的话。您正在谈论if (null == argumentValue)-check、调用静态扩展方法或装箱/拆箱的开销。除了支持可空列的好处(然后使用DBNull.Value),通用Field-方法还增加了安全性:它检查您的类型假设是否正确,并有助于发现对开发人员和更重要的错误客户多或少超过 1ms。
  • @Tim Schmelter 感谢您的反馈,关于类型假设的要点。以前从未对这些发现有过直接的答案,再次感谢您的一些见解。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-02-14
  • 2021-01-10
  • 1970-01-01
  • 2019-06-02
  • 1970-01-01
  • 1970-01-01
  • 2015-01-19
相关资源
最近更新 更多