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)); }
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)); }