예제 #1
0
 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(")");
 }
예제 #2
0
        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);
        }
예제 #3
0
        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(")");
        }