private void MaterializeSelf() { if (materializedSequence != null) { return; } materializedSequence = delayedSequence.ToList(); delayedSequence = null; }
// 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); }