public static IReadOnlyList<IReadOnlyList<JoinAlias>> ExtractJoinAliases(IFromListItem join) { var tree = ExtractJoinAliasTree(join); var ret = new List<List<JoinAlias>>(); foreach (var level in tree) { ret.Add(new List<JoinAlias>()); foreach (var rep in level.Items) { if (!ret.SelectMany(x => x).Any(x => x.Find == rep.Find)) { //Agregar el rep: var exAlias = ret.SelectMany(x => x).Where(x => CompareExpr.ExprEquals(x.Replace, rep.Rep) || CompareExpr.ExprEquals(x.Find, rep.Rep) ).Select(x => x.Alias).FirstOrDefault(); string alias; if (exAlias != null) { alias = exAlias; } else { var memberAlias = ExtractMemberStr(rep.Rep); alias = memberAlias; //Si el alias esta repetido, le ponemos un numero consecutivo for (var i = 1; i < 1000 && ret.SelectMany(x => x).Where(x => x.Alias == alias).Any(); i++) { alias = $"\"{memberAlias.Trim('"') + i}\""; } } ret[ret.Count - 1].Add(new JoinAlias(rep.Find, rep.Rep, alias)); } } } return ret; }
/// <summary> /// Remplaza todas las referencias a un elemento del WITH con un SqlTableRefRaw /// </summary> public static Expression SubqueryRawSubs(Expression subquery, ParameterExpression repParam) { if (subquery == null) { return(null); } //Sustituir todo param.X o param por el nombre: var ret = ReplaceVisitor.Replace(subquery, expr => { if (typeof(IFromListItemTarget).GetTypeInfo().IsAssignableFrom(expr.Type.GetTypeInfo())) { var selectInt = expr.Type.GetTypeInfo().ImplementedInterfaces.Concat(new[] { expr.Type }).Where(x => x.GetTypeInfo().IsGenericType&& x.GetGenericTypeDefinition() == typeof(IFromListItemTarget <>)).FirstOrDefault(); if (selectInt == null) { throw new ArgumentException("Debe de ser un IFromListItemTarget<T>"); } var selectType = selectInt.GetTypeInfo().GenericTypeArguments[0]; if (expr is MemberExpression mem && CompareExpr.ExprEquals(mem.Expression, repParam)) { return(RawSqlTableRefExpr(selectType, $"\"{mem.Member.Name}\"")); }
/// <summary> /// Devuelve la cadena a la que corresponde la expresión o null en caso de que esta expresión no tenga ningún alias /// </summary> public static string ReplaceStringAliasMembers(Expression ex, IEnumerable<ExprStrRawSql> alias) { return alias.Where(x => CompareExpr.ExprEquals(x.Expr, ex)).Select(x => x.Sql).FirstOrDefault(); }