@@ -80,17 +80,27 @@ internal static void SetFilter<T>(this IDbCommand dbCmd, string name, object val
80
80
81
81
internal static IDbCommand SetFilters < T > ( this IDbCommand dbCmd , object anonType , bool excludeDefaults )
82
82
{
83
- dbCmd . SetParameters < T > ( anonType , excludeDefaults ) ; //needs to be called first
83
+ string ignore = null ;
84
+ dbCmd . SetParameters < T > ( anonType , excludeDefaults , ref ignore ) ; //needs to be called first
84
85
dbCmd . CommandText = dbCmd . GetFilterSql < T > ( ) ;
85
86
return dbCmd ;
86
87
}
87
88
88
- internal static IDbCommand SetParameters < T > ( this IDbCommand dbCmd , object anonType , bool excludeDefaults )
89
+ internal static IDbCommand SetParameters < T > ( this IDbCommand dbCmd , object anonType , bool excludeDefaults , ref string sql ) =>
90
+ dbCmd . SetParameters ( typeof ( T ) , anonType , excludeDefaults , ref sql ) ;
91
+
92
+ private static IEnumerable GetMultiValues ( object value )
89
93
{
90
- return dbCmd . SetParameters ( typeof ( T ) , anonType , excludeDefaults ) ;
94
+ if ( value is SqlInValues inValues )
95
+ return inValues . GetValues ( ) ;
96
+
97
+ return ( value is IEnumerable enumerable &&
98
+ ! ( enumerable is string ||
99
+ enumerable is IEnumerable < KeyValuePair < string , object > > )
100
+ ) ? enumerable : null ;
91
101
}
92
102
93
- internal static IDbCommand SetParameters ( this IDbCommand dbCmd , Type type , object anonType , bool excludeDefaults )
103
+ internal static IDbCommand SetParameters ( this IDbCommand dbCmd , Type type , object anonType , bool excludeDefaults , ref string sql )
94
104
{
95
105
if ( anonType == null )
96
106
return dbCmd ;
@@ -104,16 +114,25 @@ internal static IDbCommand SetParameters(this IDbCommand dbCmd, Type type, objec
104
114
? dialectProvider . GetFieldDefinitionMap ( modelDef )
105
115
: null ;
106
116
117
+ var sqlCopy = sql ; //C# doesn't allow changing ref params in lambda's
118
+
107
119
anonType . ToObjectDictionary ( ) . ForEachParam ( modelDef , excludeDefaults , ( propName , columnName , value ) =>
108
120
{
109
121
var propType = value ? . GetType ( ) ?? typeof ( object ) ;
110
- if ( value is SqlInValues inValues )
122
+ var inValues = GetMultiValues ( value ) ;
123
+ if ( inValues != null )
111
124
{
112
125
var i = 0 ;
113
- foreach ( var item in inValues . GetValues ( ) )
126
+ var sb = StringBuilderCache . Allocate ( ) ;
127
+ foreach ( var item in inValues )
114
128
{
115
129
var p = dbCmd . CreateParameter ( ) ;
116
130
p . ParameterName = "v" + i ++ ;
131
+
132
+ if ( sb . Length > 0 )
133
+ sb . Append ( ',' ) ;
134
+ sb . Append ( dialectProvider . ParamString + p . ParameterName ) ;
135
+
117
136
p . Direction = ParameterDirection . Input ;
118
137
dialectProvider . InitDbParam ( p , item . GetType ( ) ) ;
119
138
@@ -130,6 +149,9 @@ internal static IDbCommand SetParameters(this IDbCommand dbCmd, Type type, objec
130
149
131
150
dbCmd . Parameters . Add ( p ) ;
132
151
}
152
+
153
+ var sqlIn = StringBuilderCache . ReturnAndFree ( sb ) ;
154
+ sqlCopy = sqlCopy ? . Replace ( dialectProvider . ParamString + propName , sqlIn ) ;
133
155
}
134
156
else
135
157
{
@@ -155,14 +177,15 @@ internal static IDbCommand SetParameters(this IDbCommand dbCmd, Type type, objec
155
177
156
178
p . Value = value == null ?
157
179
DBNull . Value
158
- : p . DbType == DbType . String ?
159
- value . ToString ( ) :
160
- value ;
180
+ : p . DbType == DbType . String ?
181
+ value . ToString ( ) :
182
+ value ;
161
183
162
184
dbCmd . Parameters . Add ( p ) ;
163
185
}
164
186
} ) ;
165
187
188
+ sql = sqlCopy ;
166
189
return dbCmd ;
167
190
}
168
191
@@ -337,7 +360,7 @@ internal static T Single<T>(this IDbCommand dbCmd, string sql, IEnumerable<IDbDa
337
360
338
361
internal static T Single < T > ( this IDbCommand dbCmd , string sql , object anonType )
339
362
{
340
- dbCmd . SetParameters < T > ( anonType , excludeDefaults : false ) ;
363
+ dbCmd . SetParameters < T > ( anonType , excludeDefaults : false , sql : ref sql ) ;
341
364
342
365
return OrmLiteUtils . IsScalar < T > ( )
343
366
? dbCmd . Scalar < T > ( sql )
@@ -371,7 +394,7 @@ internal static List<T> Select<T>(this IDbCommand dbCmd, string sql, IEnumerable
371
394
372
395
internal static List < T > Select < T > ( this IDbCommand dbCmd , string sql , object anonType = null )
373
396
{
374
- if ( anonType != null ) dbCmd . SetParameters < T > ( anonType , excludeDefaults : false ) ;
397
+ if ( anonType != null ) dbCmd . SetParameters < T > ( anonType , excludeDefaults : false , sql : ref sql ) ;
375
398
dbCmd . CommandText = dbCmd . GetDialectProvider ( ) . ToSelectStatement ( typeof ( T ) , sql ) ;
376
399
377
400
return dbCmd . ConvertToList < T > ( ) ;
@@ -392,7 +415,7 @@ internal static List<TModel> Select<TModel>(this IDbCommand dbCmd, Type fromTabl
392
415
393
416
internal static List < T > Select < T > ( this IDbCommand dbCmd , Type fromTableType , string sql , object anonType = null )
394
417
{
395
- if ( anonType != null ) dbCmd . SetParameters ( fromTableType , anonType , excludeDefaults : false ) ;
418
+ if ( anonType != null ) dbCmd . SetParameters ( fromTableType , anonType , excludeDefaults : false , sql : ref sql ) ;
396
419
dbCmd . CommandText = ToSelect < T > ( dbCmd . GetDialectProvider ( ) , fromTableType , sql ) ;
397
420
398
421
return dbCmd . ConvertToList < T > ( ) ;
@@ -423,7 +446,7 @@ internal static List<T> SqlList<T>(this IDbCommand dbCmd, string sql, IEnumerabl
423
446
424
447
internal static List < T > SqlList < T > ( this IDbCommand dbCmd , string sql , object anonType = null )
425
448
{
426
- if ( anonType != null ) dbCmd . SetParameters < T > ( anonType , excludeDefaults : false ) ;
449
+ if ( anonType != null ) dbCmd . SetParameters < T > ( anonType , excludeDefaults : false , sql : ref sql ) ;
427
450
dbCmd . CommandText = sql ;
428
451
429
452
return dbCmd . ConvertToList < T > ( ) ;
@@ -453,7 +476,7 @@ internal static List<T> SqlColumn<T>(this IDbCommand dbCmd, string sql, IEnumera
453
476
454
477
internal static List < T > SqlColumn < T > ( this IDbCommand dbCmd , string sql , object anonType = null )
455
478
{
456
- dbCmd . SetParameters < T > ( anonType , excludeDefaults : false ) . CommandText = sql ;
479
+ dbCmd . SetParameters < T > ( anonType , excludeDefaults : false , sql : ref sql ) . CommandText = sql ;
457
480
return dbCmd . ConvertToList < T > ( ) ;
458
481
}
459
482
@@ -472,7 +495,7 @@ internal static T SqlScalar<T>(this IDbCommand dbCmd, string sql, IEnumerable<ID
472
495
473
496
internal static T SqlScalar < T > ( this IDbCommand dbCmd , string sql , object anonType = null )
474
497
{
475
- if ( anonType != null ) dbCmd . SetParameters < T > ( anonType , excludeDefaults : false ) ;
498
+ if ( anonType != null ) dbCmd . SetParameters < T > ( anonType , excludeDefaults : false , sql : ref sql ) ;
476
499
477
500
return dbCmd . Scalar < T > ( sql ) ;
478
501
}
@@ -493,7 +516,7 @@ internal static List<T> SelectNonDefaults<T>(this IDbCommand dbCmd, object filte
493
516
494
517
internal static List < T > SelectNonDefaults < T > ( this IDbCommand dbCmd , string sql , object anonType = null )
495
518
{
496
- if ( anonType != null ) dbCmd . SetParameters < T > ( anonType , excludeDefaults : true ) ;
519
+ if ( anonType != null ) dbCmd . SetParameters < T > ( anonType , excludeDefaults : true , sql : ref sql ) ;
497
520
498
521
return dbCmd . ConvertToList < T > ( dbCmd . GetDialectProvider ( ) . ToSelectStatement ( typeof ( T ) , sql ) ) ;
499
522
}
@@ -505,7 +528,7 @@ internal static IEnumerable<T> SelectLazy<T>(this IDbCommand dbCmd, string sql,
505
528
506
529
internal static IEnumerable < T > SelectLazy < T > ( this IDbCommand dbCmd , string sql , object anonType = null )
507
530
{
508
- if ( anonType != null ) dbCmd . SetParameters < T > ( anonType , excludeDefaults : false ) ;
531
+ if ( anonType != null ) dbCmd . SetParameters < T > ( anonType , excludeDefaults : false , sql : ref sql ) ;
509
532
var dialectProvider = dbCmd . GetDialectProvider ( ) ;
510
533
dbCmd . CommandText = dialectProvider . ToSelectStatement ( typeof ( T ) , sql ) ;
511
534
@@ -539,7 +562,7 @@ internal static IEnumerable<T> ColumnLazy<T>(this IDbCommand dbCmd, string sql,
539
562
540
563
internal static IEnumerable < T > ColumnLazy < T > ( this IDbCommand dbCmd , string sql , object anonType )
541
564
{
542
- foreach ( var p in dbCmd . SetParameters < T > ( anonType , excludeDefaults : false ) . ColumnLazy < T > ( sql ) ) yield return p ;
565
+ foreach ( var p in dbCmd . SetParameters < T > ( anonType , excludeDefaults : false , sql : ref sql ) . ColumnLazy < T > ( sql ) ) yield return p ;
543
566
}
544
567
545
568
private static IEnumerable < T > ColumnLazy < T > ( this IDbCommand dbCmd , string sql )
@@ -603,7 +626,7 @@ internal static IEnumerable<T> SelectLazy<T>(this IDbCommand dbCmd)
603
626
604
627
internal static T Scalar < T > ( this IDbCommand dbCmd , string sql , object anonType = null )
605
628
{
606
- if ( anonType != null ) dbCmd . SetParameters < T > ( anonType , excludeDefaults : false ) ;
629
+ if ( anonType != null ) dbCmd . SetParameters < T > ( anonType , excludeDefaults : false , sql : ref sql ) ;
607
630
608
631
return dbCmd . Scalar < T > ( sql ) ;
609
632
}
@@ -656,7 +679,7 @@ internal static long LastInsertId(this IDbCommand dbCmd)
656
679
657
680
internal static List < T > Column < T > ( this IDbCommand dbCmd , string sql , object anonType = null )
658
681
{
659
- if ( anonType != null ) dbCmd . SetParameters < T > ( anonType , excludeDefaults : false ) ;
682
+ if ( anonType != null ) dbCmd . SetParameters < T > ( anonType , excludeDefaults : false , sql : ref sql ) ;
660
683
661
684
return dbCmd . Column < T > ( dbCmd . GetDialectProvider ( ) . ToSelectStatement ( typeof ( T ) , sql ) ) ;
662
685
}
@@ -683,7 +706,7 @@ internal static HashSet<T> ColumnDistinct<T>(this IDbCommand dbCmd, string sql,
683
706
684
707
internal static HashSet < T > ColumnDistinct < T > ( this IDbCommand dbCmd , string sql , object anonType = null )
685
708
{
686
- return dbCmd . SetParameters < T > ( anonType , excludeDefaults : false ) . ColumnDistinct < T > ( sql ) ;
709
+ return dbCmd . SetParameters < T > ( anonType , excludeDefaults : false , sql : ref sql ) . ColumnDistinct < T > ( sql ) ;
687
710
}
688
711
689
712
internal static HashSet < T > ColumnDistinct < T > ( this IDataReader reader , IOrmLiteDialectProvider dialectProvider )
0 commit comments