Beispiel #1
0
        public WhereCollectionExpression(ICollectionExpression <T> source, Expression <Func <T, bool> > predicate, Func <T, bool> predicateCompiled, Action <T, bool> predicateReversed)
            : base(source, predicate, predicateCompiled)
        {
            if (predicateCompiled == null)
            {
                var predicateReverseExpression = SetExpressionRewriter.CreateSetter(predicate);
                if (predicateReverseExpression != null)
                {
                    predicateReversed = predicateReverseExpression.Compile();
                }
            }

            PredicateSetter = predicateReversed;
        }
Beispiel #2
0
        public override INotifyExpression <T> ApplyParameters(IDictionary <string, object> parameters)
        {
            if (parameters == null)
            {
                throw new ArgumentNullException("parameters");
            }

            var applyParameters = new RepositoryChangeApplyParametersVisitor(parameters);
            var newBody         = applyParameters.Visit(Body);

            var changeInfos = ChangeInfos;

            if (applyParameters.Recorders != null)
            {
                if (changeInfos == null)
                {
                    changeInfos = applyParameters.Recorders;
                }
                else
                {
                    changeInfos = new List <IChangeInfo>(changeInfos);
                    changeInfos.AddRange(applyParameters.Recorders);
                }
            }

            if (parameters.Count == Parameters.Count)
            {
                var lambda = Expression.Lambda <Func <T> >(newBody);
                var setter = SetExpressionRewriter.CreateSetter(lambda);
                if (setter == null)
                {
                    throw new InvalidOperationException(string.Format("The lambda expression {0} could not be reversed.", newBody));
                }
                if (changeInfos == null)
                {
                    return(new RepositoryAffectedReversableNotifyValue <T>(Repository, lambda.Compile(), setter.Compile()));
                }
                else
                {
                    return(new RepositoryAffectedDependentReversableNotofyValue <T>(Repository, lambda.Compile(), setter.Compile(), changeInfos));
                }
            }
            else
            {
                return(new RepositoryAffectedReversableNotifyFunc <T>(Repository, newBody, Parameters.Where(p => !parameters.ContainsKey(p.Name)), changeInfos));
            }
        }
        public INotifyReversableExpression <T> CreateReversableExpression <T>(Expression expression, IEnumerable <ParameterExpression> parameters, IDictionary <string, object> parameterMappings)
        {
            if (parameterMappings != null)
            {
                var applyParameters = new ApplyParametersVisitor(parameterMappings);
                expression = applyParameters.Visit(expression);
            }

            if (parameters == null || (parameterMappings == null ? !parameters.Any() : parameters.Count() == parameterMappings.Count))
            {
                var lambda = Expression.Lambda <Func <T> >(expression);
                var setter = SetExpressionRewriter.CreateSetter(lambda);
                if (setter == null)
                {
                    throw new InvalidOperationException(string.Format("The lambda expression {0} could not be reversed.", expression));
                }
                return(new RepositoryAffectedReversableNotifyValue <T>(Repository, lambda.Compile(), setter.Compile()));
            }
            else
            {
                return(new RepositoryAffectedReversableNotifyFunc <T>(Repository, expression, parameters));
            }
        }
Beispiel #4
0
        public static Binding <T, TMember> Create <TMember>(Expression <Func <T, TMember> > func, Expression <Func <T, TMember> > member)
        {
            var setter = SetExpressionRewriter.CreateSetter(member) ?? throw new InvalidOperationException($"The expression {member.ToString()} could not be inverted.");

            return(Create(func, setter.Compile()));
        }