internal static ObjectQueryState Top(
            ObjectQueryState query,
            string alias,
            string count,
            ObjectParameter[] parameters)
        {
            int           length               = count.Length;
            string        commandText          = EntitySqlQueryBuilder.GetCommandText(query);
            bool          allowsLimitSubclause = ((EntitySqlQueryState)query).AllowsLimitSubclause;
            StringBuilder queryText            = new StringBuilder(!allowsLimitSubclause ? length + ("SELECT VALUE TOP(\r\n".Length + "\r\n) ".Length + alias.Length + "\r\nFROM (\r\n".Length + commandText.Length + "\r\n) AS ".Length + alias.Length) : length + (commandText.Length + "\r\nLIMIT\r\n".Length));

            if (allowsLimitSubclause)
            {
                queryText.Append(commandText);
                queryText.Append("\r\nLIMIT\r\n");
                queryText.Append(count);
            }
            else
            {
                queryText.Append("SELECT VALUE TOP(\r\n");
                queryText.Append(count);
                queryText.Append("\r\n) ");
                queryText.Append(alias);
                queryText.Append("\r\nFROM (\r\n");
                queryText.Append(commandText);
                queryText.Append("\r\n) AS ");
                queryText.Append(alias);
            }
            return(EntitySqlQueryBuilder.NewBuilderQuery(query, query.ElementType, queryText, query.Span, (IEnumerable <ObjectParameter>)EntitySqlQueryBuilder.MergeParameters(query.ObjectContext, query.Parameters, parameters)));
        }
        internal static ObjectQueryState GroupBy(
            ObjectQueryState query,
            string alias,
            string keys,
            string projection,
            ObjectParameter[] parameters)
        {
            string        commandText = EntitySqlQueryBuilder.GetCommandText(query);
            StringBuilder queryText   = new StringBuilder("SELECT ".Length + projection.Length + "\r\nFROM (\r\n".Length + commandText.Length + "\r\n) AS ".Length + alias.Length + "\r\nGROUP BY\r\n".Length + keys.Length);

            queryText.Append("SELECT ");
            queryText.Append(projection);
            queryText.Append("\r\nFROM (\r\n");
            queryText.Append(commandText);
            queryText.Append("\r\n) AS ");
            queryText.Append(alias);
            queryText.Append("\r\nGROUP BY\r\n");
            queryText.Append(keys);
            return(EntitySqlQueryBuilder.NewBuilderQuery(query, typeof(DbDataRecord), queryText, (Span)null, (IEnumerable <ObjectParameter>)EntitySqlQueryBuilder.MergeParameters(query.ObjectContext, query.Parameters, parameters)));
        }
        private static ObjectQueryState BuildSelectOrSelectValue(
            ObjectQueryState query,
            string alias,
            string projection,
            ObjectParameter[] parameters,
            string projectOp,
            Type elementType)
        {
            string        commandText = EntitySqlQueryBuilder.GetCommandText(query);
            StringBuilder queryText   = new StringBuilder(projectOp.Length + projection.Length + "\r\nFROM (\r\n".Length + commandText.Length + "\r\n) AS ".Length + alias.Length);

            queryText.Append(projectOp);
            queryText.Append(projection);
            queryText.Append("\r\nFROM (\r\n");
            queryText.Append(commandText);
            queryText.Append("\r\n) AS ");
            queryText.Append(alias);
            return(EntitySqlQueryBuilder.NewBuilderQuery(query, elementType, queryText, (Span)null, (IEnumerable <ObjectParameter>)EntitySqlQueryBuilder.MergeParameters(query.ObjectContext, query.Parameters, parameters)));
        }
        private static ObjectQueryState BuildOrderByOrWhere(
            ObjectQueryState query,
            string alias,
            string predicateOrKeys,
            ObjectParameter[] parameters,
            string op,
            string skipCount,
            bool allowsLimit)
        {
            string commandText = EntitySqlQueryBuilder.GetCommandText(query);
            int    capacity    = "SELECT VALUE ".Length + alias.Length + "\r\nFROM (\r\n".Length + commandText.Length + "\r\n) AS ".Length + alias.Length + op.Length + predicateOrKeys.Length;

            if (skipCount != null)
            {
                capacity += "\r\nSKIP\r\n".Length + skipCount.Length;
            }
            StringBuilder queryText = new StringBuilder(capacity);

            queryText.Append("SELECT VALUE ");
            queryText.Append(alias);
            queryText.Append("\r\nFROM (\r\n");
            queryText.Append(commandText);
            queryText.Append("\r\n) AS ");
            queryText.Append(alias);
            queryText.Append(op);
            queryText.Append(predicateOrKeys);
            if (skipCount != null)
            {
                queryText.Append("\r\nSKIP\r\n");
                queryText.Append(skipCount);
            }
            return(EntitySqlQueryBuilder.NewBuilderQuery(query, query.ElementType, queryText, allowsLimit, query.Span, (IEnumerable <ObjectParameter>)EntitySqlQueryBuilder.MergeParameters(query.ObjectContext, query.Parameters, parameters)));
        }
        private static ObjectQueryState BuildSetOp(
            ObjectQueryState leftQuery,
            ObjectQueryState rightQuery,
            Span newSpan,
            string setOp)
        {
            string commandText1 = EntitySqlQueryBuilder.GetCommandText(leftQuery);
            string commandText2 = EntitySqlQueryBuilder.GetCommandText(rightQuery);

            if (!object.ReferenceEquals((object)leftQuery.ObjectContext, (object)rightQuery.ObjectContext))
            {
                throw new ArgumentException(Strings.ObjectQuery_QueryBuilder_InvalidQueryArgument, "query");
            }
            StringBuilder queryText = new StringBuilder("(\r\n".Length + commandText1.Length + setOp.Length + commandText2.Length + "\r\n)".Length);

            queryText.Append("(\r\n");
            queryText.Append(commandText1);
            queryText.Append(setOp);
            queryText.Append(commandText2);
            queryText.Append("\r\n)");
            return(EntitySqlQueryBuilder.NewBuilderQuery(leftQuery, leftQuery.ElementType, queryText, newSpan, (IEnumerable <ObjectParameter>)EntitySqlQueryBuilder.MergeParameters(leftQuery.Parameters, rightQuery.Parameters)));
        }