Exemple #1
0
        public SqlQueryBody Build(bool selectCount = false)
        {
            SqlQueryBody queryBody = new SqlQueryBody()
            {
                QueryMap = QueryMap
            };

            if (string.IsNullOrEmpty(alias))
            {
                alias          = tableName;
                queryBody.From = tableName;
            }
            else
            {
                queryBody.From = string.Format("{0} {1}", tableName, alias);
            }

            if (columnNames.Count < 1)
            {
                queryBody.ColumnEnumeration = "*";
            }
            else
            {
                queryBody.ColumnEnumeration = ColumnFormatter.Format(columnNames, alias);
            }

            if (selectCount)
            {
                var countFunction = dialect.GetFunction(FunctionNames.Count);
                var sql           = countFunction.ToSqlStatement(new QueryParam("*", null));
                queryBody.ColumnEnumeration = sql;
            }

            StringBuilder joinBuilder = new StringBuilder();

            if (joins.Count > 0)
            {
                string jtype = "JOIN";

                foreach (var join in joins.Values)
                {
                    switch (join.Type)
                    {
                    case JoinType.Inner:
                        jtype = "INNER JOIN";
                        break;

                    case JoinType.Left:
                        jtype = "LEFT JOIN";
                        break;

                    case JoinType.Right:
                        jtype = "RIGHT JOIN";
                        break;

                    case JoinType.Full:
                        jtype = "FULL JOIN";
                        break;
                    }

                    joinBuilder.AppendFormat("{0} {1} {2} ON ", jtype, join.JoinTableName, join.JoinTableAlias);

                    string leftSide = string.Format("{0}.{1}", join.JoinLeftTableAlias, join.JoinRightColumn);
                    if (join.JoinRightColumn.Contains("."))
                    {
                        leftSide = join.JoinRightColumn;
                    }

                    string rightSide = string.Format("{0}.{1}", join.JoinTableAlias, join.JoinLeftColumn);
                    if (join.JoinLeftColumn.Contains("."))
                    {
                        rightSide = join.JoinLeftColumn;
                    }

                    joinBuilder.AppendFormat("{0} = {1} ", leftSide, rightSide);
                }

                queryBody.JoinEnumeration = joinBuilder.ToString().Trim();
            }

            if (whereClauses.Count > 0)
            {
                var firstWhere = whereClauses[0];
                var sql        = firstWhere.BuildSqlString(dialect, 0);
                AddToParameterList(sql.Item2);
                StringBuilder wherebuilder = new StringBuilder();
                wherebuilder.AppendFormat("{0} ", sql.Item1);

                if (whereClauses.Count > 1)
                {
                    for (int i = 1; i < whereClauses.Count; i++)
                    {
                        var where = whereClauses[i].BuildSqlString(dialect, i);
                        AddToParameterList(where.Item2);

                        string prep = "AND";
                        if (whereClauses[i].PreOperator != SqlOperator.AND)
                        {
                            prep = "OR";
                        }

                        wherebuilder.AppendFormat("{0} {1} ", prep, where.Item1);
                    }
                }

                queryBody.WhereExpression = wherebuilder.ToString().Trim();
            }

            if (sortClauses.Count > 0)
            {
                queryBody.SortExpression = string.Join(", ", sortClauses);
            }

            return(queryBody);
        }