private TranslatedQuery PrepareSubqueryParameters(SubQueryExpression subQueryExpression, out Parameter <Tuple> parameterOfTuple, out Type elementType, out ProjectionExpression projection) { // 1. Rewrite recordset and ItemProjector to parameter<tuple> var subqueryTupleParameter = context.GetTupleParameter(subQueryExpression.OuterParameter); var newDataSource = ApplyParameterToTupleParameterRewriter.Rewrite( subQueryExpression.ProjectionExpression.ItemProjector.DataSource, subqueryTupleParameter, subQueryExpression.ApplyParameter); var newItemProjectorBody = ApplyParameterToTupleParameterRewriter.Rewrite( subQueryExpression.ProjectionExpression.ItemProjector.Item, subqueryTupleParameter, subQueryExpression.ApplyParameter); var itemProjector = new ItemProjectorExpression(newItemProjectorBody, newDataSource, subQueryExpression.ProjectionExpression.ItemProjector.Context); parameterOfTuple = context.GetTupleParameter(subQueryExpression.OuterParameter); // 2. Add only parameter<tuple>. Tuple value will be assigned // at the moment of materialization in SubQuery constructor projection = new ProjectionExpression( subQueryExpression.ProjectionExpression.Type, itemProjector, subQueryExpression.ProjectionExpression.TupleParameterBindings, subQueryExpression.ProjectionExpression.ResultType); // 3. Make translation elementType = subQueryExpression.ProjectionExpression.ItemProjector.Item.Type; var resultType = SequenceHelper.GetSequenceType(elementType); var translateMethod = Translator.TranslateMethod.MakeGenericMethod(new[] { resultType }); return((TranslatedQuery)translateMethod.Invoke(context.Translator, new object[] { projection, tupleParameters.AddOne(parameterOfTuple) })); }