Đây là một chút mới cho tôi. Tôi đã được yêu cầu viết một chương trình ETL tải hai bộ dữ liệu vào cùng một bảng. Tập dữ liệu số 1 đã hoàn thành và chứa tất cả dữ liệu cho bảng. Tập dữ liệu số 2, tuy nhiên, chỉ chứa thay đổi cần phải được phủ lên tập dữ liệu đầu tiên. Quan sát:Khung thực thể - Chỉ cập nhật các giá trị không rỗng
// Dataset # 1: Widget Bảng
+----+------+------+------+------+
| ID | COL1 | COL2 | COL3 | COL4 |
+----+------+------+------+------+
| 1 | abcd | abcd | abcd | abcd |
+----+------+------+------+------+
| 2 | abcd | abcd | abcd | abcd |
+----+------+------+------+------+
// Dataset # 2: Widgets_Changes Bảng
+----+------+------+------+------+
| ID | COL1 | COL2 | COL3 | COL4 |
+----+------+------+------+------+
| 1 | | efgh | | ijkl |
+----+------+------+------+------+
| 2 | mnop | | qrst | |
+----+------+------+------+------+
// Các kết quả được mong đợi: Widgets với tất cả các thay đổi
+----+------+------+------+------+
| ID | COL1 | COL2 | COL3 | COL4 |
+----+------+------+------+------+
| 1 | abcd | efgj | abcd | ijkl |
+----+------+------+------+------+
| 2 | mnop | abcd | qrst | abcd |
+----+------+------+------+------+
Cách tiếp cận rõ ràng (mà tôi đang cố gắng tránh) là kéo từng tiện ích ra khỏi bảng đầu tiên và thực hiện thuộc tính-b y-bất động sản so sánh:
// 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();
}
Tuy nhiên, có hơn 200 trường trong tập dữ liệu đặc biệt này, với các tập tin hơn cả incoming mà tuân theo cùng phương pháp này (hoàn thành bộ dữ liệu kèm theo bộ dữ liệu khác) nhưng có một schema khác nhau hoàn toàn. Rõ ràng, tôi muốn có một cái gì đó di động mà tôi chỉ có thể chạy các tập tin thông qua thay vì phải so sánh tài sản-by-tài sản mã cứng cho mỗi tập dữ liệu.
Có cách nào tôi có thể lặp qua các thuộc tính của cả hai đối tượng và cập nhật các giá trị không rỗng?
Bạn có thể sử dụng tính năng phản chiếu để thực hiện việc đó, sử dụng PropertyInfo để nhận các thuộc tính –