Пример #1
0
 protected virtual Expression VisitJoin(JoinExpression node)
 {
     Expression left = VisitSource(node.Left);
     Expression right = VisitSource(node.Right);
     Expression condition = Visit(node.Condition);
     if (node.Left != left || node.Right != right || node.Condition != condition)
     {
         return new JoinExpression(node.Type, left, right, condition);
     }
     return node;
 }
Пример #2
0
 private Expression BindJoin(Type resultType, Expression outerSource, Expression innerSource,
                             LambdaExpression outerKey, LambdaExpression innerKey,
                             LambdaExpression resultSelector)
 {
     ProjectionExpression outerProjection = VisitSequence(outerSource);
     ProjectionExpression innerProjection = VisitSequence(innerSource);
     _map[outerKey.Parameters[0]] = outerProjection.Projector;
     Expression outerKeyExpr = Visit(outerKey.Body);
     _map[innerKey.Parameters[0]] = innerProjection.Projector;
     Expression innerKeyExpr = Visit(innerKey.Body);
     _map[resultSelector.Parameters[0]] = outerProjection.Projector;
     _map[resultSelector.Parameters[1]] = innerProjection.Projector;
     Expression resultExpr = Visit(resultSelector.Body);
     var join = new JoinExpression(resultType, outerProjection.Source, innerProjection.Source,
                                   Expression.Equal(outerKeyExpr, innerKeyExpr));
     SourceAlias alias = GetNextAlias();
     ProjectedColumns pc = ProjectColumns(resultExpr, alias, outerProjection.Source.Alias,
                                          innerProjection.Source.Alias);
     return new ProjectionExpression(
         new SelectExpression(alias, pc.Columns, join, null),
         pc.Projector
         );
 }