public static IQueryable <TTarget> SyncWith <TTarget, TKey>(this IQueryable <TTarget> target, IQueryable <TTarget> source, Expression <Func <TTarget, TKey> > keySelector, SyncFields syncFields, params Expression <Func <TTarget, object> >[] syncSelectors) { if (target == null) { throw new ArgumentNullException(nameof(target)); } if (source == null) { throw new ArgumentNullException(nameof(source)); } if (keySelector == null) { throw new ArgumentNullException(nameof(keySelector)); } return(target.Provider.Execute <IQueryable <TTarget> >(Expression.Call(null, ((MethodInfo)MethodBase.GetCurrentMethod()).MakeGenericMethod(typeof(TTarget), typeof(TKey)), target.Expression, source.Expression, Expression.Quote(keySelector), Expression.Constant(syncFields), Expression.NewArrayInit(typeof(Expression <Func <TTarget, object> >), syncSelectors)))); }
public static IQueryable <TSource> SyncWith <TSource, TKey>(this IEnumerable <TSource> target, IEnumerable <TSource> source, Func <TSource, TKey> keySelector, SyncFields fieldSelectionType, params Expression <Func <TSource, object> >[] syncSelectors) { if (target == null) { throw new ArgumentNullException(nameof(target)); } if (source == null) { throw new ArgumentNullException(nameof(source)); } if (keySelector == null) { throw new ArgumentNullException(nameof(keySelector)); } var results = target.Join(source, keySelector, keySelector, (t, s) => new { Target = t, Source = s }).ToList(); var syncProperties = syncSelectors.Select(x => x.GetPropertyInfo()).ToList(); var properties = fieldSelectionType == SyncFields.Include ? syncProperties : typeof(TSource).GetCachedProperties().Where(x => !syncProperties.Contains(x)).ToList(); results.ForEach(x => properties.ForEach(y => y.SetValue(x.Target, y.GetValue(x.Source, null), null))); return(target.AsQueryable()); }