@ -2,31 +2,36 @@
using System.Collections.Generic ;
using System.Linq ;
using System.Text ;
using System.Text.RegularExpressions ;
using System.Threading.Tasks ;
namespace SqlSugar.GBase
{
public class GBaseQueryBuilder : QueryBuilder
{
public override bool IsComplexModel ( string sql )
{
return Regex . IsMatch ( sql , @"AS ""\w+\.\w+""" ) | | Regex . IsMatch ( sql , @"AS ""\w+\.\w+\.\w+""" ) ;
}
public override string SqlTemplate
{
get
{
return "SELECT {0}{" + UtilConstants . ReplaceKey + "} FROM {1}{2}{3}{4}" ;
return "SELECT {0}{" + UtilConstants . ReplaceKey + "} FROM {1}{2}{3}{4}" ;
}
}
public override string ToSqlString ( )
public override string ToSqlString ( )
{
var oldTake = Take ;
var oldSkip = Skip ;
var isDistinctPage = IsDistinct & & ( Take > 1 | | Skip > 1 ) ;
if ( isDistinctPage )
if ( isDistinctPage )
{
Take = null ;
Skip = null ;
}
var result = _ ToSqlString ( ) ;
if ( isDistinctPage )
if ( isDistinctPage )
{
if ( this . OrderByValue . HasValue ( ) )
{
@ -35,13 +40,13 @@ namespace SqlSugar.GBase
}
Take = oldTake ;
Skip = oldSkip ;
result = this . Context . SqlQueryable < object > ( result ) . Skip ( Skip ? ? 0 ) . Take ( Take ? ? 0 ) . ToSql ( ) . Key ;
result = this . Context . SqlQueryable < object > ( result ) . Skip ( Skip ? ? 0 ) . Take ( Take ? ? 0 ) . ToSql ( ) . Key ;
}
if ( result . IndexOf ( "-- No table" ) > 0 )
if ( TranLock ! = null )
{
return "-- No table" ;
result = result + TranLock ;
}
return result ;
}
@ -52,71 +57,63 @@ namespace SqlSugar.GBase
var isIgnoreOrderBy = this . IsCount & & this . PartitionByValue . IsNullOrEmpty ( ) ;
AppendFilter ( ) ;
sql = new StringBuilder ( ) ;
var oldOrderByValue = this . OrderByValue ;
if ( this . OrderByValue = = null & & ( Skip ! = null | | Take ! = null ) ) this . OrderByValue = " ORDER BY GetDate() " ;
if ( this . OrderByValue = = null & & ( Skip ! = null | | Take ! = null ) ) this . OrderByValue = " ORDER BY " + this . Builder . SqlDateNow + " " ;
if ( this . PartitionByValue . HasValue ( ) )
{
this . OrderByValue = this . PartitionByValue + this . OrderByValue ;
}
var isFirst = ( Skip = = 0 | | Skip = = null ) & & Take = = 1 & & DisableTop = = false ;
var isTop = ( Skip = = null & & Take ! = null & & DisableTop = = false ) ;
var isRowNumber = ( Skip ! = null | | Take ! = null ) & & ! isFirst & & ! isTop ;
if ( ! isRowNumber & & oldOrderByValue = = null ) { this . OrderByValue = null ; }
if ( isFirst & & oldOrderByValue = = "ORDER BY GETDATE() " ) { this . OrderByValue = null ; }
var rowNumberString = string . Format ( ",ROW_NUMBER() OVER({0}) AS RowIndex " , GetOrderByString ) ;
var isRowNumber = Skip ! = null | | Take ! = null ;
var rowNumberString = string . Format ( ",CAST(ROW_NUMBER() OVER({0}) AS INT) AS RowIndex " , GetOrderByString ) ;
string groupByValue = GetGroupByString + HavingInfos ;
string orderByValue = ( ! isRowNumber & & this . OrderByValue . HasValue ( ) ) ? GetOrderByString : null ;
if ( isIgnoreOrderBy ) { orderByValue = null ; }
sql . AppendFormat ( SqlTemplate , GetSelect ( isFirst , isTop ) , base . GetTableNameString , base . GetWhereValueString , groupByValue , orderByValue ) ;
sql . AppendFormat ( SqlTemplate , GetSelectValue , GetTableNameString , GetWhereValueString , groupByValue , orderByValue ) ;
sql . Replace ( UtilConstants . ReplaceKey , isRowNumber ? ( isIgnoreOrderBy ? null : rowNumberString ) : null ) ;
if ( isIgnoreOrderBy ) { this . OrderByValue = oldOrderBy ; return sql . ToString ( ) ; }
var result = ( isFirst | | isTop ) ? sql . ToString ( ) : ToPageSql ( sql . ToString ( ) , this . Take , this . Skip ) ;
var result = ToPageSql ( sql . ToString ( ) , this . Take , this . Skip ) ;
if ( ExternalPageIndex > 0 )
{
if ( externalOrderBy . IsNullOrEmpty ( ) )
{
externalOrderBy = " ORDER BY GetDate() " ;
externalOrderBy = " ORDER BY " + this . Builder . SqlDateNow + " " ;
}
result = string . Format ( "SELECT *,ROW_NUMBER() OVER({0}) AS RowIndex2 FROM ({1}) ExternalTable " , GetExternalOrderBy ( externalOrderBy ) , result ) ;
result = string . Format ( "SELECT ExternalTable. *,ROW_NUMBER() OVER({0}) AS RowIndex2 FROM ({1}) ExternalTable " , GetExternalOrderBy ( externalOrderBy ) , result ) ;
result = ToPageSql2 ( result , ExternalPageIndex , ExternalPageSize , true ) ;
}
this . OrderByValue = oldOrderBy ;
if ( ! string . IsNullOrEmpty ( this . Offset ) )
result = GetSqlQuerySql ( result ) ;
if ( result . IndexOf ( "-- No table" ) > 0 )
{
if ( this . OrderByValue . IsNullOrEmpty ( ) )
{
result + = " ORDER BY GETDATE() " ;
if ( this . OldSql . HasValue ( ) )
this . OldSql + = " ORDER BY GETDATE() " ;
}
else
{
if ( this . OldSql . HasValue ( ) )
this . OldSql + = ( " " + this . GetOrderByString ) ;
}
result + = this . Offset ;
if ( this . OldSql . HasValue ( ) )
this . OldSql + = this . Offset ;
return "-- No table" ;
}
result = GetSqlQuerySql ( result ) ;
return result ;
}
private string GetSelect ( bool isFirst , bool isTop )
public override string ToPageSql ( string sql , int? take , int? skip , bool isExternal = false )
{
if ( isFirst )
string temp = isExternal ? ExternalPageTempalte : PageTempalte ;
if ( skip ! = null & & take = = null )
{
return ( " TOP 1 " + GetSelect Value) ;
return string . Format ( temp , sql . ToString ( ) , skip . ObjToInt ( ) + 1 , long . MaxValue ) ;
}
else if ( isTop )
else if ( skip = = null & & take ! = null )
{
return ( $" TOP {this.Take} " + GetSelectValue ) ;
return string . Format ( temp , sql . ToString ( ) , 1 , take . ObjToInt ( ) ) ;
}
else
{
return GetSelectValue ;
else if ( skip ! = null & & take ! = null )
{
return string . Format ( temp , sql . ToString ( ) , skip . ObjToInt ( ) + 1 , skip . ObjToInt ( ) + take . ObjToInt ( ) ) ;
}
else
{
return sql . ToString ( ) ;
}
}
public override string ToPageSql2 ( string sql , int? pageIndex , int? pageSize , bool isExternal = false )
{
string temp = isExternal ? ExternalPageTempalte : PageTempalte ;
return string . Format ( temp , sql . ToString ( ) , ( pageIndex - 1 ) * pageSize + 1 , pageIndex * pageSize ) ;
}
}
}