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); }