internal R Translate <R>(Expression expression, Func <ITranslateResult, R> continuation) //For debugging purposes
        {
            AliasGenerator aliasGenerator = new AliasGenerator();

            ITranslateResult result;

            using (HeavyProfiler.Log("LINQ", () => expression.ToString()))
                using (var log = HeavyProfiler.LogNoStackTrace("Clean"))
                {
                    Expression cleaned = Clean(expression, true, log) !;
                    var        binder  = new QueryBinder(aliasGenerator);
                    log.Switch("Bind");
                    ProjectionExpression binded    = (ProjectionExpression)binder.BindQuery(cleaned);
                    ProjectionExpression optimized = (ProjectionExpression)Optimize(binded, binder, aliasGenerator, log);
                    log.Switch("ChPrjFlatt");
                    ProjectionExpression flat = ChildProjectionFlattener.Flatten(optimized, aliasGenerator);
                    log.Switch("TB");
                    result = TranslatorBuilder.Build(flat);
                }
            return(continuation(result));
        }