コード例 #1
0
        protected override Provider VisitPredicateJoin(PredicateJoinProvider provider)
        {
            List <int> leftMapping;
            List <int> rightMapping;

            SplitMappings(provider, out leftMapping, out rightMapping);

            leftMapping.AddRange(mappingsGatherer.Gather(provider.Predicate,
                                                         provider.Predicate.Parameters[0]));
            rightMapping.AddRange(mappingsGatherer.Gather(provider.Predicate,
                                                          provider.Predicate.Parameters[1]));

            var newLeftProvider  = provider.Left;
            var newRightProvider = provider.Right;

            VisitJoin(ref leftMapping, ref newLeftProvider, ref rightMapping, ref newRightProvider);
            mappings[provider] = MergeMappings(provider.Left, leftMapping, rightMapping);
            var predicate = TranslateJoinPredicate(leftMapping, rightMapping, provider.Predicate);

            if (newLeftProvider == provider.Left && newRightProvider == provider.Right &&
                provider.Predicate == predicate)
            {
                return(provider);
            }
            return(new PredicateJoinProvider(newLeftProvider, newRightProvider, (Expression <Func <Tuple, Tuple, bool> >)predicate, provider.JoinType));
        }
コード例 #2
0
        /// <inheritdoc/>
        protected override SqlProvider VisitPredicateJoin(PredicateJoinProvider provider)
        {
            var left  = Compile(provider.Left);
            var right = Compile(provider.Right);

            var leftShouldUseReference = ShouldUseQueryReference(provider, left);
            var leftTable = leftShouldUseReference
        ? left.PermanentReference
        : left.Request.Statement.From;
            var leftColumns = leftShouldUseReference
        ? leftTable.Columns.Cast <SqlColumn>()
        : left.Request.Statement.Columns;
            var leftExpressions = leftShouldUseReference
        ? leftTable.Columns.Cast <SqlExpression>().ToList()
        : ExtractColumnExpressions(left.Request.Statement);

            var rightShouldUseReference = ShouldUseQueryReference(provider, right);
            var rightTable = rightShouldUseReference
        ? right.PermanentReference
        : right.Request.Statement.From;
            var rightColumns = rightShouldUseReference
        ? rightTable.Columns.Cast <SqlColumn>()
        : right.Request.Statement.Columns;
            var rightExpressions = rightShouldUseReference
        ? rightTable.Columns.Cast <SqlExpression>().ToList()
        : ExtractColumnExpressions(right.Request.Statement);


            var joinType = provider.JoinType == JoinType.LeftOuter ? SqlJoinType.LeftOuterJoin : SqlJoinType.InnerJoin;

            var result         = ProcessExpression(provider.Predicate, leftExpressions, rightExpressions);
            var joinExpression = result.First;
            var bindings       = result.Second;

            var joinedTable = SqlDml.Join(
                joinType,
                leftTable,
                rightTable,
                leftColumns.ToList(),
                rightColumns.ToList(),
                joinExpression);

            var query = SqlDml.Select(joinedTable);

            if (!leftShouldUseReference)
            {
                query.Where &= left.Request.Statement.Where;
            }
            if (!rightShouldUseReference)
            {
                query.Where &= right.Request.Statement.Where;
            }
            query.Columns.AddRange(joinedTable.AliasedColumns);
            return(CreateProvider(query, bindings, provider, left, right));
        }
コード例 #3
0
        protected override Provider VisitPredicateJoin(PredicateJoinProvider provider)
        {
            var left       = VisitCompilable(provider.Left);
            var leftOrder  = sortOrder;
            var right      = VisitCompilable(provider.Right);
            var rightOrder = sortOrder;
            var result     = left == provider.Left && right == provider.Right
        ? provider
        : new PredicateJoinProvider(left, right, provider.Predicate, provider.JoinType);

            sortOrder = ComputeBinaryOrder(provider, leftOrder, rightOrder);
            return(result);
        }
コード例 #4
0
        protected override Provider VisitPredicateJoin(PredicateJoinProvider provider)
        {
            CompilableProvider left;
            CompilableProvider right;

            VisitBinaryProvider(provider, out left, out right);

            if (provider.JoinType == JoinType.LeftOuter)
            {
                EnsureAbsenceOfApplyProviderRequiringConversion();
            }

            if (left != provider.Left || right != provider.Right)
            {
                return(new PredicateJoinProvider(left, right, provider.Predicate, provider.JoinType));
            }
            return(provider);
        }
コード例 #5
0
 /// <summary>
 /// Compiles <see cref="PredicateJoinProvider"/>.
 /// </summary>
 /// <param name="provider">Join provider.</param>
 protected abstract TResult VisitPredicateJoin(PredicateJoinProvider provider);