To dla mnie coś nowego. Poproszono mnie o napisanie programu ETL, który ładuje dwa zestawy danych do tej samej tabeli. Zbiór danych nr 1 jest kompletny i zawiera wszystkie dane dla tabeli. Zbiór danych nr 2 zawiera tylko zmian, które muszą zostać nałożone na pierwszy zestaw danych. Przestrzegać:Entity Framework - Aktualizuj tylko te wartości, które nie są zerowe.
// Zbiór danych # 1: Tabela Widgety
+----+------+------+------+------+
| ID | COL1 | COL2 | COL3 | COL4 |
+----+------+------+------+------+
| 1 | abcd | abcd | abcd | abcd |
+----+------+------+------+------+
| 2 | abcd | abcd | abcd | abcd |
+----+------+------+------+------+
// Zbiór danych # 2: Widgets_Changes Tabela
+----+------+------+------+------+
| ID | COL1 | COL2 | COL3 | COL4 |
+----+------+------+------+------+
| 1 | | efgh | | ijkl |
+----+------+------+------+------+
| 2 | mnop | | qrst | |
+----+------+------+------+------+
// Planowany Wynik: Widgety wszystkich zmian
+----+------+------+------+------+
| ID | COL1 | COL2 | COL3 | COL4 |
+----+------+------+------+------+
| 1 | abcd | efgj | abcd | ijkl |
+----+------+------+------+------+
| 2 | mnop | abcd | qrst | abcd |
+----+------+------+------+------+
Oczywistym podejściem (którego staram się unikać) jest wyciągnięcie każdego widgetu z pierwszej tabeli i wykonanie właściwości b Porównanie y nieruchomości:
// 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();
}
Jednakże, istnieje ponad 200 pól w tym konkretnym zbiorze, z więcej przychodzących plików, które przylegają do tej samej metodologii (kompletny zestaw danych towarzyszy diff zbioru danych), ale mają inny schemat całości. Oczywiście wolałbym mieć coś przenośnego, żebym mógł po prostu uruchamiać pliki zamiast zmuszać do twardego kodowania porównań własności według każdego zestawu danych.
Czy istnieje sposób można iterować właściwości obu obiektów i wartości aktualizacji, które nie są zerowe?
Możesz użyć odbicia, aby to zrobić, użyj PropertyInfo, aby uzyskać właściwości –