private Expression <Func <StoredEntry, bool> > TranslatePredicate(Expression <Func <IEntryState <TId, TData>, bool> > predicate)
        {
            Assert(predicate != null);

            var parameter = Expression.Parameter(typeof(StoredEntry));
            var body      = ParameterExpressionReplacer.ReplaceParameter(predicate.Body, predicate.Parameters.First(), parameter);

            return(Expression.Lambda <Func <StoredEntry, bool> >(body, parameter));
        }
Beispiel #2
0
        private Expression <TDelegate> ConvertExpression <TDelegate>(LambdaExpression expression)
            where TDelegate : Delegate
        {
            var parameter = expression.Parameters.First();
            var body      = expression.Body;

            var newParameter = Expression.Parameter(typeof(TRemote));
            var newBody      = ParameterExpressionReplacer.ReplaceParameter(body, parameter, newParameter);

            return(Expression.Lambda <TDelegate>(newBody, newParameter));
        }
        private static Expression <Func <TEntry, bool> > BuildPredicate <TEntry>(TEntry comparand,
                                                                                 Expression <Func <TEntry, TEntry, bool> > equalityComparer)
        {
            Assert(comparand != null);
            Assert(equalityComparer != null);

            var idSelector        = DataPropertyHelper.BuildPredicate(comparand);
            var comparandConstant = Expression.Constant(comparand, typeof(TEntry));
            var parameter         = equalityComparer.Parameters.First();
            var equality          = ParameterExpressionReplacer.ReplaceParameter(equalityComparer.Body, equalityComparer.Parameters.Last(), comparandConstant);
            var idEquality        = ParameterExpressionReplacer.ReplaceParameter(idSelector.Body, idSelector.Parameters.First(), parameter);
            var body = Expression.AndAlso(idEquality, equality);

            return(Expression.Lambda <Func <TEntry, bool> >(body, parameter));
        }
        public static Expression <Func <TDataRepresentation, bool> > TranslatePredicate <TId, TData, TDataRepresentation>(Expression <Func <TData, bool> > predicate)
            where TData : class
            where TDataRepresentation : class, IDataRepresentation <TId, TData>
        {
            // The resulting predicate checks
            // 1) If the entry's payload matches the specified predicate.
            // 2) If the entry's data is not null (The entry is not deleted)

            var parameter    = Expression.Parameter(typeof(TDataRepresentation));
            var dataAccessor = DataHelper <TId, TData> .Accessor;
            var nullConstant = DataHelper <TId, TData> .Null;

            var data             = ParameterExpressionReplacer.ReplaceParameter(dataAccessor.Body, dataAccessor.Parameters.First(), parameter);
            var isNull           = Expression.ReferenceEqual(data, nullConstant);
            var isNotNull        = Expression.Not(isNull);
            var matchesPredicate = ParameterExpressionReplacer.ReplaceParameter(predicate.Body, predicate.Parameters.First(), data);
            var body             = Expression.AndAlso(isNotNull, matchesPredicate);

            return(Expression.Lambda <Func <TDataRepresentation, bool> >(body, parameter));
        }
        private static Expression <Func <TEntry, TEntry, bool> > BuildEqualityComparer <TEntry, TVersion>(Expression <Func <TEntry, TVersion> > versionSelector)
            where TEntry : class
            where TVersion : IEquatable <TVersion>
        {
            Assert(versionSelector != null);

            var param1 = Expression.Parameter(typeof(TEntry), "left");
            var param2 = Expression.Parameter(typeof(TEntry), "right");

            var version1 = ParameterExpressionReplacer.ReplaceParameter(versionSelector.Body, versionSelector.Parameters.First(), param1);
            var version2 = ParameterExpressionReplacer.ReplaceParameter(versionSelector.Body, versionSelector.Parameters.First(), param2);

            var equalityMethod = typeof(IEquatable <TVersion>).GetMethod(nameof(Equals));

            Assert(equalityMethod != null);

            var call = Expression.Call(version1, equalityMethod, version2);

            Expression equality;

            if (typeof(TVersion).IsValueType)
            {
                equality = call;
            }
            else // (left == null && right == null) || (left != null && right != null && left.Equals(right));
            {
                var isNull1    = Expression.Equal(version1, Expression.Constant(null, typeof(TVersion)));
                var isNull2    = Expression.Equal(version2, Expression.Constant(null, typeof(TVersion)));
                var isNotNull1 = Expression.Not(isNull1);
                var isNotNull2 = Expression.Not(isNull2);

                var bothNull    = Expression.AndAlso(isNull1, isNull2);
                var bothNotNUll = Expression.AndAlso(isNotNull1, isNotNull2);

                equality = Expression.OrElse(bothNull, Expression.AndAlso(bothNotNUll, call));
            }

            return(Expression.Lambda <Func <TEntry, TEntry, bool> >(equality, param1, param2));
        }