예제 #1
0
 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))));
 }
예제 #2
0
        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());
        }