示例#1
0
        private void UpdateOrderingInfoWithSkipTokenWrapper(Type resultWrapperType)
        {
            OrderingInfo        info       = new OrderingInfo(true);
            ParameterExpression expression = Expression.Parameter(resultWrapperType, "w");

            foreach (OrderingExpression expression2 in this.topLevelOrderingInfo.OrderingExpressions)
            {
                LambdaExpression expression3 = (LambdaExpression)expression2.Expression;
                Expression       body        = ParameterReplacerVisitor.Replace(expression3.Body, expression3.Parameters[0], Expression.MakeMemberAccess(expression, resultWrapperType.GetProperty("ExpandedElement")));
                info.Add(new OrderingExpression(Expression.Lambda(body, new ParameterExpression[] { expression }), expression2.IsAscending));
            }
            this.topLevelOrderingInfo = info;
        }
示例#2
0
        private MemberBinding[] GetSkipTokenBindings(Type skipTokenWrapperType, string skipTokenDescription, ParameterExpression expandParameter)
        {
            MemberBinding[] bindingArray = new MemberBinding[this.topLevelOrderingInfo.OrderingExpressions.Count + 2];
            bindingArray[0] = Expression.Bind(skipTokenWrapperType.GetProperty("ExpandedElement"), expandParameter);
            bindingArray[1] = Expression.Bind(skipTokenWrapperType.GetProperty("Description"), Expression.Constant(skipTokenDescription.ToString()));
            int num = 0;

            foreach (OrderingExpression expression in this.topLevelOrderingInfo.OrderingExpressions)
            {
                LambdaExpression expression2 = (LambdaExpression)expression.Expression;
                Expression       expression3 = ParameterReplacerVisitor.Replace(expression2.Body, expression2.Parameters[0], expandParameter);
                MemberInfo       property    = skipTokenWrapperType.GetProperty("ProjectedProperty" + num.ToString(CultureInfo.InvariantCulture));
                bindingArray[num + 2] = Expression.Bind(property, expression3);
                num++;
            }
            return(bindingArray);
        }
        internal static Expression ComposeQueryInterceptors(IDataService service, ResourceSetWrapper container)
        {
            MethodInfo[] queryInterceptors = container.QueryInterceptors;
            if ((queryInterceptors == null) || (queryInterceptors.Length == 0))
            {
                return(null);
            }
            LambdaExpression expression = null;

            for (int i = 0; i < queryInterceptors.Length; i++)
            {
                Expression expression2;
                try
                {
                    expression2 = (Expression)queryInterceptors[i].Invoke(service.Instance, WebUtil.EmptyObjectArray);
                }
                catch (TargetInvocationException exception)
                {
                    ErrorHandler.HandleTargetInvocationException(exception);
                    throw;
                }
                if (expression2 == null)
                {
                    throw new InvalidOperationException(System.Data.Services.Strings.DataService_AuthorizationReturnedNullQuery(queryInterceptors[i].Name, queryInterceptors[i].DeclaringType.FullName));
                }
                LambdaExpression expression3 = (LambdaExpression)expression2;
                if (expression == null)
                {
                    expression = expression3;
                }
                else
                {
                    ParameterExpression newExpression = expression.Parameters[0];
                    Expression          right         = ParameterReplacerVisitor.Replace(expression3.Body, expression3.Parameters[0], newExpression);
                    expression = Expression.Lambda(Expression.And(expression.Body, right), new ParameterExpression[] { newExpression });
                }
            }
            return(expression);
        }
示例#4
0
        internal static Expression ComposePropertyNavigation(Expression expression, LambdaExpression filterLambda, bool propagateNull, bool isSingleResult)
        {
            Expression nullLiteral = ExpressionUtils.NullLiteral;

            if (isSingleResult)
            {
                Expression right   = ParameterReplacerVisitor.Replace(filterLambda.Body, filterLambda.Parameters[0], expression);
                Expression test    = propagateNull ? Expression.AndAlso(Expression.NotEqual(expression, nullLiteral), right) : right;
                Expression ifTrue  = expression;
                Expression ifFalse = Expression.Constant(null, ifTrue.Type);
                return(Expression.Condition(test, ifTrue, ifFalse));
            }
            Type       targetType  = filterLambda.Parameters[0].Type;
            Expression expression7 = expression.EnumerableWhere(filterLambda);

            if (propagateNull)
            {
                Expression expression8  = Expression.Equal(expression, nullLiteral);
                Expression expression9  = expression7;
                Expression expression10 = ExpressionUtils.EnumerableEmpty(targetType);
                return(Expression.Condition(expression8, expression10, expression9, expression10.Type));
            }
            return(expression7);
        }