// Constructors

// ReSharper disable MemberCanBeProtected.Global
        public SubQuery(ProjectionExpression projectionExpression, TranslatedQuery query, Parameter <Tuple> parameter, Tuple tuple, ItemMaterializationContext context)
// ReSharper restore MemberCanBeProtected.Global
        {
            this.provider = context.Session.Query.Provider;
            var tupleParameterBindings = new Dictionary <Parameter <Tuple>, Tuple>(projectionExpression.TupleParameterBindings);
            var currentTranslatedQuery = query;

            var outerParameterContext = context.ParameterContext;
            var parameterContext      = new ParameterContext(outerParameterContext);

            // Gather Parameter<Tuple> values from current ParameterScope for future use.
            outerParameterContext.SetValue(parameter, tuple);
            foreach (var tupleParameter in currentTranslatedQuery.TupleParameters)
            {
                var value = outerParameterContext.GetValue(tupleParameter);
                tupleParameterBindings[tupleParameter] = value;
                parameterContext.SetValue(tupleParameter, value);
            }

            this.projectionExpression = new ProjectionExpression(
                projectionExpression.Type,
                projectionExpression.ItemProjector,
                tupleParameterBindings,
                projectionExpression.ResultAccessMethod);
            var translatedQuery = new TranslatedQuery(
                query.DataSource,
                query.Materializer,
                query.ResultAccessMethod,
                tupleParameterBindings,
                EnumerableUtils <Parameter <Tuple> > .Empty);

            delayedQuery = new DelayedQuery <TElement>(context.Session, translatedQuery, parameterContext);
            context.Session.RegisterUserDefinedDelayedQuery(delayedQuery.Task);
            context.MaterializationContext.MaterializationQueue.Enqueue(MaterializeSelf);
        }
        private TranslatedQuery Translate(ProjectionExpression projection,
                                          IEnumerable <Parameter <Tuple> > tupleParameterBindings)
        {
            var newItemProjector = projection.ItemProjector.EnsureEntityIsJoined();
            var result           = new ProjectionExpression(
                projection.Type,
                newItemProjector,
                projection.TupleParameterBindings,
                projection.ResultAccessMethod);
            var optimized = Optimize(result);

            // Prepare cached query, if required
            var prepared = compiledQueryScope != null
        ? PrepareCachedQuery(optimized, compiledQueryScope)
        : optimized;

            // Compilation
            var dataSource = prepared.ItemProjector.DataSource;
            var compiled   = context.Domain.Handler.CompilationService.Compile(dataSource, context.RseCompilerConfiguration);

            // Build materializer
            var materializer    = BuildMaterializer(prepared, tupleParameterBindings);
            var translatedQuery = new TranslatedQuery(
                compiled, materializer, prepared.ResultAccessMethod,
                projection.TupleParameterBindings, tupleParameterBindings);

            // Providing the result to caching layer, if required
            if (compiledQueryScope != null && translatedQuery.TupleParameters.Count == 0)
            {
                var parameterizedQuery = new ParameterizedQuery(
                    translatedQuery,
                    compiledQueryScope.QueryParameter);
                compiledQueryScope.ParameterizedQuery = parameterizedQuery;
                return(parameterizedQuery);
            }

            return(translatedQuery);
        }
        // Constructors

// ReSharper disable MemberCanBeProtected.Global
        public SubQuery(ProjectionExpression projectionExpression, TranslatedQuery query, Parameter <Tuple> parameter, Tuple tuple, ItemMaterializationContext context)
// ReSharper restore MemberCanBeProtected.Global
        {
            this.provider = context.Session.Query.Provider;
            var tupleParameterBindings = new Dictionary <Parameter <Tuple>, Tuple>(projectionExpression.TupleParameterBindings);
            var currentTranslatedQuery = ((TranslatedQuery <IEnumerable <TElement> >)query);

            // Gather Parameter<Tuple> values from current ParameterScope for future use.
            parameter.Value = tuple;
            foreach (var tupleParameter in currentTranslatedQuery.TupleParameters)
            {
                var value = tupleParameter.Value;
                tupleParameterBindings[tupleParameter] = value;
            }
            var parameterContext = new ParameterContext();

            using (parameterContext.Activate())
                foreach (var tupleParameter in currentTranslatedQuery.TupleParameters)
                {
                    tupleParameter.Value = tupleParameter.Value;
                }

            this.projectionExpression = new ProjectionExpression(
                projectionExpression.Type,
                projectionExpression.ItemProjector,
                tupleParameterBindings,
                projectionExpression.ResultType);
            var translatedQuery = new TranslatedQuery <IEnumerable <TElement> >(
                query.DataSource,
                (Func <IEnumerable <Tuple>, Session, Dictionary <Parameter <Tuple>, Tuple>, ParameterContext, IEnumerable <TElement> >)query.UntypedMaterializer,
                tupleParameterBindings,
                EnumerableUtils <Parameter <Tuple> > .Empty);

            delayedSequence = new DelayedSequence <TElement>(context.Session, translatedQuery, parameterContext);
            context.Session.RegisterUserDefinedDelayedQuery(delayedSequence.Task);
            context.MaterializationContext.MaterializationQueue.Enqueue(MaterializeSelf);
        }
 public ParameterizedQuery(TranslatedQuery translatedQuery, Parameter parameter)
     : base(translatedQuery.DataSource, translatedQuery.Materializer, translatedQuery.ResultAccessMethod)
 {
     QueryParameter = parameter;
 }
 public ParameterizedQuery(TranslatedQuery <TResult> translatedQuery, Parameter parameter)
     : base(translatedQuery.DataSource, translatedQuery.Materializer)
 {
     QueryParameter = parameter;
 }
 static TResult ExecuteScalarQuery(TranslatedQuery query, Session session, ParameterContext parameterContext)
 {
     return(query.ExecuteScalar <TResult>(session, parameterContext));
 }
 public Grouping(ProjectionExpression projectionExpression, TranslatedQuery translatedQuery, Parameter <Tuple> parameter, Tuple tuple, TKey key, ItemMaterializationContext context)
     : base(projectionExpression, translatedQuery, parameter, tuple, context)
 {
     Key = key;
 }