Bu, benim için yeni bir bittir. Aynı tabloya iki veri kümesi yükleyen bir ETL programı yazmam istendi. Veri kümesi # 1 tamamlandı ve tablo için tüm verileri içerir. Ancak, Veri Kümesi # 2, yalnızca ilk veri kümesine eklenmesi gereken değişiklikleri içerir. Gözlemleyin:Entity Framework - Yalnızca sıfır olmayan değerleri güncelleştirin
// Veri kümesi # 1: Widget'lar Tablo
+----+------+------+------+------+
| ID | COL1 | COL2 | COL3 | COL4 |
+----+------+------+------+------+
| 1 | abcd | abcd | abcd | abcd |
+----+------+------+------+------+
| 2 | abcd | abcd | abcd | abcd |
+----+------+------+------+------+
// Veri kümesi # 2: Widgets_Changes Tablo
+----+------+------+------+------+
| ID | COL1 | COL2 | COL3 | COL4 |
+----+------+------+------+------+
| 1 | | efgh | | ijkl |
+----+------+------+------+------+
| 2 | mnop | | qrst | |
+----+------+------+------+------+
// Beklenen Sonuç: Tüm Değişiklikler ile Widget'lar
+----+------+------+------+------+
| ID | COL1 | COL2 | COL3 | COL4 |
+----+------+------+------+------+
| 1 | abcd | efgj | abcd | ijkl |
+----+------+------+------+------+
| 2 | mnop | abcd | qrst | abcd |
+----+------+------+------+------+
Belirgin yaklaşım (kaçınmaya çalıştığım) her bir aracı ilk tablodan çıkarmak ve bir özellik-b y-mülk karşılaştırması:
// 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();
}
Ancak, bu aynı metodoloji (fark veri kümesi eşliğinde tam veri kümesi) uymaları fakat tamamen farklı bir şema var, gelen fazla dosyalarla bu özel veri kümesindeki 200'den fazla alanlar vardır. Açıkçası, her veri kümesi için özellik-özellik karşılaştırmaları için sabit kodlar yapmak yerine dosyaları çalıştırabileceğim taşınabilir bir şey olmasını tercih ederim.
Her iki nesnenin özellikleriyle ve null olmayan güncelleme değerleriyle yineleyebileceğim bir yol var mı?
Bunu yapmak için yansımayı kullanabilirsiniz, özellikleri almak için PropertyInfo özelliğini kullanın –