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