@@ -980,42 +980,96 @@ protected SqlStringBuilder WhereString(string alias, string[] columnNames, int b
980
980
{
981
981
// if not a composite key, use "foo in (?, ?, ?)" for batching
982
982
// if no batch, and not a composite key, use "foo = ?"
983
- string tableAlias = GenerateAliasForColumn ( alias , columnNames [ 0 ] ) ;
984
- InFragment inf = new InFragment ( ) . SetColumn ( tableAlias , columnNames [ 0 ] ) ;
983
+ var columnName = columnNames [ 0 ] ;
984
+
985
+ var tableAlias = GenerateAliasForColumn ( alias , columnName ) ;
986
+ var qualifiedName = ! string . IsNullOrEmpty ( tableAlias )
987
+ ? tableAlias + StringHelper . Dot + columnName
988
+ : columnName ;
989
+
990
+ var whereString = new SqlStringBuilder ( batchSize * 5 ) ;
991
+ whereString . Add ( qualifiedName ) ;
992
+ if ( batchSize == 1 )
993
+ {
994
+ whereString . Add ( "=" ) . Add ( Parameter . Placeholder ) ;
995
+ }
996
+ else
997
+ {
998
+ bool added = false ;
985
999
986
- for ( int i = 0 ; i < batchSize ; i ++ )
987
- inf . AddValue ( Parameter . Placeholder ) ;
1000
+ whereString . Add ( " in (" ) ;
1001
+ for ( var i = 0 ; i < batchSize ; i ++ )
1002
+ {
1003
+ var value = Parameter . Placeholder ;
1004
+ if ( added )
1005
+ {
1006
+ whereString . Add ( StringHelper . CommaSpace ) ;
1007
+ }
988
1008
989
- return new SqlStringBuilder ( inf . ToFragmentString ( ) ) ;
1009
+ whereString . Add ( value ) ;
1010
+
1011
+ added = true ;
1012
+ }
1013
+
1014
+ whereString . Add ( StringHelper . ClosedParen ) ;
1015
+ }
1016
+
1017
+ return whereString ;
990
1018
}
991
1019
else
992
1020
{
993
- var fragments = new ConditionalFragment [ batchSize ] ;
994
- for ( int i = 0 ; i < batchSize ; i ++ )
995
- {
996
- fragments [ i ] = new ConditionalFragment ( )
997
- . SetTableAlias ( alias )
998
- . SetCondition ( columnNames , Parameter . GenerateParameters ( columnNames . Length ) ) ;
999
- }
1000
-
1001
- var whereString = new SqlStringBuilder ( ) ;
1002
-
1003
- if ( fragments . Length == 1 )
1021
+ if ( batchSize == 1 )
1004
1022
{
1005
1023
// if no batch, use "foo = ? and bar = ?"
1006
- whereString . Add ( fragments [ 0 ] . ToSqlStringFragment ( ) ) ;
1024
+ var whereString = new SqlStringBuilder ( columnNames . Length * 4 ) ;
1025
+ ColumnFragment ( whereString , alias , columnNames ) ;
1026
+ return whereString ;
1007
1027
}
1008
1028
else
1009
1029
{
1010
1030
// if batching, use "( (foo = ? and bar = ?) or (foo = ? and bar = ?) )"
1011
- var df = new DisjunctionFragment ( fragments ) ;
1012
1031
1032
+ var whereString = new SqlStringBuilder ( ) ;
1013
1033
whereString . Add ( StringHelper . OpenParen ) ;
1014
- whereString . Add ( df . ToFragmentString ( ) ) ;
1034
+
1035
+ var added = false ;
1036
+ for ( var i = 0 ; i < batchSize ; i ++ )
1037
+ {
1038
+ if ( added )
1039
+ {
1040
+ whereString . Add ( " or " ) ;
1041
+ }
1042
+
1043
+ whereString . Add ( "(" ) ;
1044
+ ColumnFragment ( whereString , alias , columnNames ) ;
1045
+ whereString . Add ( ")" ) ;
1046
+ added = true ;
1047
+ }
1015
1048
whereString . Add ( StringHelper . ClosedParen ) ;
1049
+ return whereString ;
1050
+ }
1051
+ }
1052
+ }
1053
+
1054
+ private static void ColumnFragment ( SqlStringBuilder builder , string alias , string [ ] columnNames )
1055
+ {
1056
+ //foo = ? and bar = ?
1057
+ var prefix = alias + StringHelper . Dot ;
1058
+ var added = false ;
1059
+ foreach ( var columnName in columnNames )
1060
+ {
1061
+ if ( added )
1062
+ {
1063
+ builder . Add ( " and " ) ;
1016
1064
}
1017
1065
1018
- return whereString ;
1066
+ builder
1067
+ . Add ( prefix )
1068
+ . Add ( columnName )
1069
+ . Add ( "=" )
1070
+ . Add ( Parameter . Placeholder ) ;
1071
+
1072
+ added = true ;
1019
1073
}
1020
1074
}
1021
1075
0 commit comments