这对我来说有点新。我被要求编写一个 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 多个字段,传入的文件更多,它们遵循相同的方法(完整的数据集伴随着 diff 数据集),但具有完全不同的模式。显然,我宁愿有一些可移植的东西,我可以通过它运行文件,而不是为每个数据集硬编码逐个属性的比较。
有没有办法可以遍历两个对象的属性并更新不为空的值?