@@ -83,12 +83,12 @@ protected virtual SqlExpression<T> CopyTo(SqlExpression<T> to)
8383 to . modelDef = modelDef ;
8484 to . tableDefs = tableDefs ;
8585
86- to . selectExpression = selectExpression ;
87- to . OnlyFields = OnlyFields != null ? new HashSet < string > ( OnlyFields , StringComparer . OrdinalIgnoreCase ) : null ;
88-
8986 to . UpdateFields = UpdateFields ;
9087 to . InsertFields = InsertFields ;
9188
89+ to . selectExpression = selectExpression ;
90+ to . OnlyFields = OnlyFields != null ? new HashSet < string > ( OnlyFields , StringComparer . OrdinalIgnoreCase ) : null ;
91+
9292 to . TableAlias = TableAlias ;
9393 to . fromExpression = fromExpression ;
9494 to . whereExpression = whereExpression ;
@@ -123,18 +123,41 @@ protected virtual SqlExpression<T> CopyTo(SqlExpression<T> to)
123123 /// </summary>
124124 public string ComputeHash ( bool includeParams = true )
125125 {
126- var sb = StringBuilderCache . Allocate ( ) ;
126+ var uniqueExpr = Dump ( includeParams ) ;
127+ // fastest up to 500 chars https://wintermute79.wordpress.com/2014/10/10/c-sha-1-benchmark/
128+ using var sha1 = new System . Security . Cryptography . SHA1Managed ( ) ;
129+ var hash = sha1 . ComputeHash ( Encoding . ASCII . GetBytes ( uniqueExpr ) ) ;
130+ var hexFormat = hash . ToHex ( ) ;
131+
132+ return hexFormat ;
133+ }
127134
128- if ( ! string . IsNullOrEmpty ( selectExpression ) )
129- sb . AppendLine ( selectExpression ) ;
130- if ( ! OnlyFields . IsEmpty ( ) )
131- sb . AppendLine ( OnlyFields . Join ( "," ) ) ;
135+ /// <summary>
136+ /// Dump internal state of this SqlExpression into a string
137+ /// </summary>
138+ /// <param name="includeParams"></param>
139+ /// <returns></returns>
140+ public string Dump ( bool includeParams )
141+ {
142+ var sb = StringBuilderCache . Allocate ( ) ;
132143
144+ sb . Append ( '<' ) . Append ( ModelDef . Name ) ;
145+ foreach ( var tableDef in tableDefs )
146+ {
147+ sb . Append ( ',' ) . Append ( tableDef ) ;
148+ }
149+ sb . Append ( '>' ) . AppendLine ( ) ;
150+
133151 if ( ! UpdateFields . IsEmpty ( ) )
134152 sb . AppendLine ( UpdateFields . Join ( "," ) ) ;
135153 if ( ! InsertFields . IsEmpty ( ) )
136154 sb . AppendLine ( InsertFields . Join ( "," ) ) ;
137155
156+ if ( ! string . IsNullOrEmpty ( selectExpression ) )
157+ sb . AppendLine ( selectExpression ) ;
158+ if ( ! OnlyFields . IsEmpty ( ) )
159+ sb . AppendLine ( OnlyFields . Join ( "," ) ) ;
160+
138161 if ( ! string . IsNullOrEmpty ( TableAlias ) )
139162 sb . AppendLine ( TableAlias ) ;
140163 if ( ! string . IsNullOrEmpty ( fromExpression ) )
@@ -169,25 +192,23 @@ public string ComputeHash(bool includeParams=true)
169192 sb . Append ( hasEnsureConditions ? "1" : "0" ) ;
170193 sb . AppendLine ( ) ;
171194
172- if ( includeParams && Params . Count > 0 )
195+ if ( includeParams )
173196 {
174- sb . AppendLine ( "PARAMS:" ) ;
175- for ( var i = 0 ; i < Params . Count ; i ++ )
197+ sb . Append ( "PARAMS:" ) . Append ( Params . Count ) . AppendLine ( ) ;
198+ if ( Params . Count > 0 )
176199 {
177- sb . Append ( Params [ i ] . ParameterName ) . Append ( '=' ) ;
178- sb . AppendLine ( Params [ i ] . Value . ConvertTo < string > ( ) ) ;
200+ foreach ( var p in Params )
201+ {
202+ sb . Append ( p . ParameterName ) . Append ( '=' ) ;
203+ sb . AppendLine ( p . Value . ConvertTo < string > ( ) ) ;
204+ }
179205 }
180206 }
181207
182208 var uniqueExpr = StringBuilderCache . ReturnAndFree ( sb ) ;
183- // fastest up to 500 chars https://wintermute79.wordpress.com/2014/10/10/c-sha-1-benchmark/
184- using var sha1 = new System . Security . Cryptography . SHA1Managed ( ) ;
185- var hash = sha1 . ComputeHash ( Encoding . ASCII . GetBytes ( uniqueExpr ) ) ;
186- var hexFormat = hash . ToHex ( ) ;
187-
188- return hexFormat ;
209+ return uniqueExpr ;
189210 }
190-
211+
191212 /// <summary>
192213 /// Clear select expression. All properties will be selected.
193214 /// </summary>
0 commit comments