public TResult Execute <TResult>(Expression expression)
        {
            var q = _root.GetQueryable(_queryableExpression);

            if (_enumerableRootObject == null)
            {
                if (expression is MethodCallExpression m)
                {
                    var args = m.Arguments.ToArray();
                    var type = _root.GetType();
                    if (_queryableExpression != null)
                    {
                        type = _queryableExpression.Type;
                    }
                    if (type.IsGenericType)
                    {
                        type = type.GetGenericArguments()[0];
                    }
                    args[0]    = Expression.Call(null, FullDbUtility.GetOfTypeMethod(type), Expression.Constant(q));
                    expression = m.Update(null, args);
                }
            }
            else
            {
                expression = _enumerableRootObject.GetEnumerableExpression(q);
            }
            return(ExecuteExpression <TResult>(expression));
        }
 public IQueryable <TElement> CreateQuery <TElement>(Expression expression)
 {
     if (_enumerableRootObject == null && FullDbUtility.IsQueryableExpression(expression))
     {
         _queryableExpression = expression;
         return(new FullDbQueryObject <TElement>(this, expression));
     }
     else
     {
         if (_enumerableRootObject == null)
         {
             if (expression is MethodCallExpression m)
             {
                 var args = m.Arguments.ToArray();
                 args[0]    = Expression.Constant(null, typeof(IQueryable <TElement>));
                 expression = m.Update(null, args);
             }
         }
         var temp = new FullDbQueryObject <TElement>(this, expression);
         if (_enumerableRootObject == null)
         {
             _enumerableRootObject = temp;
         }
         return(temp);
     }
 }