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