Example #1
0
        public override void VisitJoinClause(JoinClause joinClause, QueryModel queryModel, int index)
        {
            base.VisitJoinClause(joinClause, queryModel, index);

            var subQuery = joinClause.InnerSequence as SubQueryExpression;

            if (subQuery != null)
            {
                var isOuter = subQuery.QueryModel.ResultOperators.OfType <DefaultIfEmptyResultOperator>().Any();

                _builder.AppendFormat("{0} join (", isOuter ? "left outer" : "inner");

                VisitQueryModel(subQuery.QueryModel, true);

                var alias = _aliases.GetTableAlias(subQuery.QueryModel.MainFromClause);
                _builder.AppendFormat(") as {0} on (", alias);
            }
            else
            {
                var queryable = ExpressionWalker.GetCacheQueryable(joinClause);
                var tableName = ExpressionWalker.GetTableNameWithSchema(queryable);
                var alias     = _aliases.GetTableAlias(joinClause);
                _builder.AppendFormat("inner join {0} as {1} on (", tableName, alias);
            }

            BuildJoinCondition(joinClause.InnerKeySelector, joinClause.OuterKeySelector);

            _builder.Append(") ");
        }
Example #2
0
        /// <summary>
        /// Appends as clause.
        /// </summary>
        public StringBuilder AppendAsClause(StringBuilder builder, IFromClause clause)
        {
            Debug.Assert(builder != null);
            Debug.Assert(clause != null);

            var queryable = ExpressionWalker.GetCacheQueryable(clause);
            var tableName = ExpressionWalker.GetTableNameWithSchema(queryable);

            builder.AppendFormat("{0} as {1}", tableName, GetTableAlias(clause));

            return(builder);
        }
Example #3
0
        public override void VisitJoinClause(JoinClause joinClause, QueryModel queryModel, int index)
        {
            base.VisitJoinClause(joinClause, queryModel, index);

            var subQuery = joinClause.InnerSequence as SubQueryExpression;

            if (subQuery != null)
            {
                var isOuter = subQuery.QueryModel.ResultOperators.OfType <DefaultIfEmptyResultOperator>().Any();

                _builder.AppendFormat("{0} join (", isOuter ? "left outer" : "inner");

                VisitQueryModel(subQuery.QueryModel, true);

                var queryable = ExpressionWalker.GetCacheQueryable(subQuery.QueryModel.MainFromClause);
                var alias     = _aliases.GetTableAlias(queryable);
                _builder.AppendFormat(") as {0} on (", alias);
            }
            else
            {
                var innerExpr = joinClause.InnerSequence as ConstantExpression;

                if (innerExpr == null)
                {
                    throw new NotSupportedException("Unexpected JOIN inner sequence (subqueries are not supported): " +
                                                    joinClause.InnerSequence);
                }

                if (!(innerExpr.Value is ICacheQueryable))
                {
                    throw new NotSupportedException("Unexpected JOIN inner sequence " +
                                                    "(only results of cache.ToQueryable() are supported): " +
                                                    innerExpr.Value);
                }

                var queryable = ExpressionWalker.GetCacheQueryable(joinClause);
                var tableName = ExpressionWalker.GetTableNameWithSchema(queryable);
                _builder.AppendFormat("inner join {0} as {1} on (", tableName, _aliases.GetTableAlias(tableName));
            }

            BuildJoinCondition(joinClause.InnerKeySelector, joinClause.OuterKeySelector);

            _builder.Append(") ");
        }
Example #4
0
        /// <summary>
        /// Gets the table alias.
        /// </summary>
        public string GetTableAlias(ICacheQueryableInternal queryable)
        {
            Debug.Assert(queryable != null);

            return(GetTableAlias(ExpressionWalker.GetTableNameWithSchema(queryable)));
        }