public static void FullOuterJoinExample() { var m1 = new ModelTest3 { WellId = 123, LayerId = "PL0001", BeginDate = new DateTime(2017, 7, 7), EndDate = new DateTime(2017, 8, 16), Rn = null }; var m2 = new ModelTest3 { WellId = 123, LayerId = "PL0001", BeginDate = new DateTime(2017, 8, 16), EndDate = new DateTime(2017, 8, 17), Rn = 2 }; var n1 = new ModelTest3 { WellId = 123, LayerId = "PL0001", BeginDate = new DateTime(2017, 7, 7), EndDate = new DateTime(2017, 8, 16), Rn = 111 }; var t1 = new List <ModelTest3> { m1 }; var t2 = new List <ModelTest3> { n1 }; var result = new List <ModelTest3>(); if (t1.Count == 0 && t2.Count > 0) { result = t2; } if (t2.Count == 0 && t1.Count > 0) { result = t1; } if (t1.Count > 0 && t2.Count > 0) { var res = t1.FullOuterJoin(t2, lKey => new { lKey.WellId, lKey.LayerId }, rKey => new { rKey.WellId, rKey.LayerId }, (left, right) => new ModelTest3() { WellId = (left == null || left.WellId == 0) ? right.WellId : left.WellId, LayerId = (left == null || String.IsNullOrEmpty(left.LayerId)) ? right.LayerId : left.LayerId, BeginDate = (left == null || left.BeginDate == null) ? right.BeginDate : left.BeginDate, EndDate = (left == null || left.EndDate == null) ? right.EndDate : left.EndDate, Rn = (left == null || left.Rn == null || left.Rn == 0) ? right.Rn : left.Rn, } ); result = (res.GroupBy(x => new { x.WellId, x.LayerId, x.BeginDate }).Select(g => g.First())).ToList(); } }
public static void ResultSelector(ModelTest3 left, ModelTest3 right) { ModelTest3 result = new ModelTest3(); Type t = typeof(ModelTest3); var properties = t.GetProperties().Where(prop => prop.CanRead && prop.CanWrite); foreach (var prop in properties) { var leftValue = prop.GetValue(left, null); var rightValue = prop.GetValue(right, null); if (leftValue != null) { prop.SetValue(result, leftValue, null); } else { prop.SetValue(result, rightValue, null); } } }