private static ClientObject GetRootClientObjectForClientQueryableExpression(Expression exp)
        {
            ClientObject   clientObject = null;
            ExpressionType nodeType     = exp.NodeType;

            if (nodeType != ExpressionType.Call)
            {
                if (nodeType == ExpressionType.Constant)
                {
                    ConstantExpression constantExpression = (ConstantExpression)exp;
                    clientObject = (constantExpression.Value as ClientObject);
                    if (clientObject == null)
                    {
                        throw DataRetrieval.CreateInvalidQueryExpressionException(exp);
                    }
                }
            }
            else
            {
                MethodCallExpression methodCallExpression = (MethodCallExpression)exp;
                if (methodCallExpression.Object != null)
                {
                    clientObject = DataRetrieval.GetRootClientObjectForClientQueryableExpression(methodCallExpression.Object);
                }
                else
                {
                    if (methodCallExpression.Arguments.Count <= 0)
                    {
                        throw DataRetrieval.CreateInvalidQueryExpressionException(methodCallExpression);
                    }
                    clientObject = DataRetrieval.GetRootClientObjectForClientQueryableExpression(methodCallExpression.Arguments[0]);
                }
            }
            return(clientObject);
        }
        internal static ClientQueryableResult <T> Retrieve <T>(ClientQueryable <T> clientQueryable) where T : ClientObject
        {
            Expression expression = clientQueryable.Expression;
            ClientQueryableResult <T> clientQueryableResult           = new ClientQueryableResult <T>();
            ClientObject rootClientObjectForClientQueryableExpression = DataRetrieval.GetRootClientObjectForClientQueryableExpression(expression);

            if (rootClientObjectForClientQueryableExpression == null)
            {
                throw new InvalidQueryExpressionException();
            }
            ClientQueryInternal clientQueryInternal = new ClientQueryInternal(rootClientObjectForClientQueryableExpression, null, false, null);

            rootClientObjectForClientQueryableExpression.Context.AddQueryIdAndResultObject(clientQueryInternal.Id, clientQueryableResult);
            rootClientObjectForClientQueryableExpression.Context.AddQuery(clientQueryInternal);
            DataRetrieval.QueryProcessInfo      queryProcessInfo      = new DataRetrieval.QueryProcessInfo();
            DataRetrieval.QueryMethodAggregator queryMethodAggregator = new DataRetrieval.QueryMethodAggregator(expression);
            DataRetrieval.ProcessQueryExpression(clientQueryInternal, rootClientObjectForClientQueryableExpression, expression, false, queryProcessInfo, queryMethodAggregator);
            queryMethodAggregator.Check();
            if (queryMethodAggregator.Include == 0)
            {
                clientQueryInternal.ChildItemQuery.SelectAllProperties();
            }
            queryProcessInfo.FinalProcess();
            return(clientQueryableResult);
        }