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(") "); }
/// <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); }
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(") "); }
/// <summary> /// Gets the table alias. /// </summary> public string GetTableAlias(ICacheQueryableInternal queryable) { Debug.Assert(queryable != null); return(GetTableAlias(ExpressionWalker.GetTableNameWithSchema(queryable))); }