private void HandleFromClause(QueryExpression node, FromClauseExpression fromExpr, int i) { var e2 = fromExpr.Container; BlockExpression l1 = MakeLambda(_range, e2); if (i == node.Clauses.Count - 1 && node.Ending is SelectClauseExpression) { var l2 = MakeLambda(_range, fromExpr.Identifier, node.Ending.BaseExpr); BlockExpression[] lambdas = { l1, l2 }; var sm = MakeMethodCall("SelectMany", lambdas); Simplify(fromExpr, sm); node.Ending = null; } else { var constructor = MakeTupleConstructor(_range, fromExpr.Identifier, TupleDepth(fromExpr)); var l2 = MakeLambda(_range, fromExpr.Identifier, constructor); BlockExpression[] lambdas = { l1, l2 }; var sm = MakeMethodCall("SelectMany", lambdas); Simplify(fromExpr, sm); string name; InjectTransparentIdentifier(node, i, TupleDepth(fromExpr), _range, fromExpr.Identifier, out name); _range = new Declaration(name, null); FromClause(node).Identifier = _range; } }
override public void OnFromClauseExpression(FromClauseExpression node) { if (node.DeclaredType) { var typ = node.Identifier.Type; var gen = new GenericReferenceExpression(typ.LexicalInfo); gen.GenericArguments.Add(typ); gen.Target = new MemberReferenceExpression(node.Container, "Cast"); var inv = new MethodInvocationExpression(node.Container.LexicalInfo, gen); node.Container = inv; } base.OnFromClauseExpression(node); }
override public void OnQueryExpression(QueryExpression node) { if (node.Cont != null) { QueryContinuationExpression cont = node.Cont; node.Cont = null; QueryExpression outer = cont.Body.CloneNode(); outer.LexicalInfo = node.LexicalInfo; var newFrom = new FromClauseExpression(FromClause(node).LexicalInfo); newFrom.Container = node; outer.Clauses.Insert(0, newFrom); ReplaceCurrentNode(outer); } base.OnQueryExpression(node); }