Esempio n. 1
0
        internal static System.Linq.Expressions.Expression TransformPredicateExpression(this IQueryVisitor visitor, System.Linq.Expressions.Expression expression)
        {
            System.Linq.Expressions.Expression result = expression;
            if (expression is System.Linq.Expressions.MethodCallExpression)
            {
                System.Linq.Expressions.MethodCallExpression methodCallExpression = (System.Linq.Expressions.MethodCallExpression)expression;
                if ((methodCallExpression.Method == typeof(EntityExtensions).GetMethod("Predicate")) && (methodCallExpression.Arguments.Count > 1) &&
                    (methodCallExpression.Arguments[1] != null) && (methodCallExpression.Arguments[1] is System.Linq.Expressions.ConstantExpression))
                {
                    object item;
                    if (!TransformedExpressionsCache.TryGetValue(expression, out item))
                    {
                        object objectValue = ((System.Linq.Expressions.ConstantExpression)methodCallExpression.Arguments[1]).Value;
                        Uri    predicate   = (Uri)objectValue;
                        Type   type;
                        string name;
                        visitor.GetMappingDetails(predicate, methodCallExpression.Arguments[0].Type, out type, out name);
                        System.Linq.Expressions.MemberExpression memberExpression = System.Linq.Expressions.Expression.MakeMemberAccess(methodCallExpression.Arguments[0], type.GetProperty(name));
                        TransformedExpressionsCache[expression] = result = memberExpression;
                    }
                    else
                    {
                        result = (System.Linq.Expressions.MemberExpression)item;
                    }
                }
            }

            return(result);
        }