这对我来说有点新鲜。我被要求编写一个ETL程序,将两个数据集加载到同一张表中。数据集#1是完整的,并包含表中的所有数据。然而,数据集#2只包含需要覆盖在第一个数据集上的更改。请看下面:
// 数据集#1:小部件表
+----+------+------+------+------+
| ID | COL1 | COL2 | COL3 | COL4 |
+----+------+------+------+------+
| 1 | abcd | abcd | abcd | abcd |
+----+------+------+------+------+
| 2 | abcd | abcd | abcd | abcd |
+----+------+------+------+------+
// 数据集 #2: Widgets_Changes 表格
+----+------+------+------+------+
| ID | COL1 | COL2 | COL3 | COL4 |
+----+------+------+------+------+
| 1 | | efgh | | ijkl |
+----+------+------+------+------+
| 2 | mnop | | qrst | |
+----+------+------+------+------+
// 预期结果:小部件具有所有更改
+----+------+------+------+------+
| ID | COL1 | COL2 | COL3 | COL4 |
+----+------+------+------+------+
| 1 | abcd | efgj | abcd | ijkl |
+----+------+------+------+------+
| 2 | mnop | abcd | qrst | abcd |
+----+------+------+------+------+
显而易见的方法(我试图避免)是将第一个表格中的每个小部件分离出来,并逐个属性进行比较:
// Simplified example:
using ( var db = new MyEntityDatabase() ){
var widget = from p in db.Widgets select p where p.ID == 1;
var widget_diff = from p in db.Widgets_Changes select p where p.ID == 1
widget.COL1 = widget_diff.COL1 ?? widget.COL1;
widget.COL2 = widget_diff.COL2 ?? widget.COL2;
widget.COL3 = widget_diff.COL3 ?? widget.COL3;
// ...etc
db.saveChanges();
}
然而,这个特定数据集中有超过200个字段,还有更多遵循同样方法的文件正在到来,但完全有不同的架构。显然,我希望有一种便携式的方法,可以直接运行文件,而不是针对每个数据集硬编码属性比较。
有没有一种方法可以迭代两个对象的属性,并更新不为空的值?