コード例 #1
0
 private void MaterializeSelf()
 {
     if (materializedSequence != null)
     {
         return;
     }
     materializedSequence = delayedSequence.ToList();
     delayedSequence      = null;
 }
コード例 #2
0
        // 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);
        }