private static void ArrayAgg(MethodCallExpression methodCall, StringBuilder queryBuilder, Action<Expression> visitExpression, IPostgresConverterFactory converter) { queryBuilder.Append("(SELECT array_agg("); var sqe = methodCall.Arguments[0] as SubQueryExpression; var alias = "\"-sq-\""; if (sqe != null) { var me = sqe.QueryModel.SelectClause.Selector as MemberExpression; if (me != null) queryBuilder.Append("\"").Append(converter.GetName(me.Member)).Append("\""); else { visitExpression(sqe.QueryModel.SelectClause.Selector); alias = "\"" + sqe.QueryModel.MainFromClause.ItemName + "\""; } } else queryBuilder.Append(alias); queryBuilder.Append(") FROM "); if (methodCall.Arguments[0] is MemberExpression) queryBuilder.Append("unnest("); else queryBuilder.Append('('); visitExpression(methodCall.Arguments[0]); queryBuilder.Append(") "); queryBuilder.Append(alias); queryBuilder.Append(")"); }
private string BuildMemberPath(MemberExpression me, bool nest) { var list = new List <string>(); while (me != null) { list.Add(ConverterFactory.GetName(me.Member)); var qse = me.Expression as QuerySourceReferenceExpression; var par = me.Expression as ParameterExpression; if (qse != null || par != null) { var sb = new StringBuilder(); var name = qse != null ? qse.ReferencedQuerySource.ItemName : par.Name; if (par != null && !string.IsNullOrEmpty(Context.Name)) { sb.Append(Context.Name); } sb.Append('"').Append(name).Append('"'); list.Reverse(); foreach (var m in list) { if (nest) { sb.Insert(0, '('); sb.Append(')'); } sb.Append(".\"").Append(m).Append("\""); } return(sb.ToString()); } me = me.Expression as MemberExpression; } return(null); }
private static void ArrayAggMethod(MethodCallExpression methodCall, StringBuilder queryBuilder, Action <Expression> visitExpression, IPostgresConverterFactory converter, bool distinct) { queryBuilder.Append("(SELECT array_agg("); if (distinct) { queryBuilder.Append("DISTINCT "); } var sqe = methodCall.Arguments[0] as SubQueryExpression; var alias = "\"-sq-\""; if (sqe != null) { var me = sqe.QueryModel.SelectClause.Selector as MemberExpression; if (me != null) { queryBuilder.Append("\"").Append(converter.GetName(me.Member)).Append("\""); } else { visitExpression(sqe.QueryModel.SelectClause.Selector); alias = "\"" + sqe.QueryModel.MainFromClause.ItemName + "\""; } } else { queryBuilder.Append(alias); } queryBuilder.Append(") FROM "); if (methodCall.Arguments[0] is MemberExpression) { queryBuilder.Append("unnest("); } else { queryBuilder.Append('('); } visitExpression(methodCall.Arguments[0]); queryBuilder.Append(") "); queryBuilder.Append(alias); queryBuilder.Append(")"); }