@@ -130,13 +130,13 @@ public string AddNullableSuffixIfNeeded(string csharpType, bool notNull)
130130 return IsTypeNullable ( csharpType ) ? $ "{ csharpType } ?" : csharpType ;
131131 }
132132
133- public string GetCsharpType ( Column column )
133+ public string GetCsharpType ( Column column , Query ? query )
134134 {
135- var csharpType = GetCsharpTypeWithoutNullableSuffix ( column ) ;
135+ var csharpType = GetCsharpTypeWithoutNullableSuffix ( column , query ) ;
136136 return AddNullableSuffixIfNeeded ( csharpType , column . NotNull ) ;
137137 }
138138
139- private string GetCsharpTypeWithoutNullableSuffix ( Column column )
139+ private string GetCsharpTypeWithoutNullableSuffix ( Column column , Query ? query )
140140 {
141141 if ( column . EmbedTable != null )
142142 return column . EmbedTable . Name . ToModelName ( column . EmbedTable . Schema , DefaultSchema ) ;
@@ -147,6 +147,13 @@ private string GetCsharpTypeWithoutNullableSuffix(Column column)
147147 if ( IsEnumType ( column ) )
148148 return column . Type . Name . ToModelName ( column . Table . Schema , DefaultSchema ) ;
149149
150+ if ( query is not null )
151+ {
152+ var foundOverride = FindOverrideForQueryColumn ( query , column ) ;
153+ if ( foundOverride is not null )
154+ return foundOverride . CsharpType . Type ;
155+ }
156+
150157 foreach ( var columnMapping in ColumnMappings
151158 . Where ( columnMapping => DoesColumnMappingApply ( columnMapping , column ) ) )
152159 {
@@ -177,14 +184,29 @@ private static bool DoesColumnMappingApply(ColumnMapping columnMapping, Column c
177184 return typeInfo . Length . Value == column . Length ;
178185 }
179186
180- public string GetColumnReader ( Column column , int ordinal )
187+ private string GetColumnReader ( OverrideOption overrideOption , int ordinal )
188+ {
189+ var columnMapping = ColumnMappings . Find ( c => c . CsharpType == overrideOption . CsharpType . Type ) ;
190+ if ( columnMapping is not null )
191+ return columnMapping . ReaderFn ( ordinal ) ;
192+ throw new NotSupportedException ( $ "Column { overrideOption . Column } has unsupported column type: { overrideOption . CsharpType . Type } ") ;
193+ }
194+
195+ public string GetColumnReader ( Column column , int ordinal , Query ? query )
181196 {
182197 if ( IsEnumType ( column ) )
183198 {
184199 var enumName = column . Type . Name . ToModelName ( column . Table . Schema , DefaultSchema ) ;
185200 return $ "{ Variable . Reader . AsVarName ( ) } .GetString({ ordinal } ).To{ enumName } ()";
186201 }
187202
203+ if ( query is not null )
204+ {
205+ var foundOverride = FindOverrideForQueryColumn ( query , column ) ;
206+ if ( foundOverride is not null )
207+ return GetColumnReader ( foundOverride , ordinal ) ;
208+ }
209+
188210 foreach ( var columnMapping in ColumnMappings
189211 . Where ( columnMapping => DoesColumnMappingApply ( columnMapping , column ) ) )
190212 {
@@ -227,10 +249,10 @@ public string GetIdColumnType(Query query)
227249 var tableColumns = Tables [ query . InsertIntoTable . Schema ] [ query . InsertIntoTable . Name ] . Columns ;
228250 var idColumn = tableColumns . First ( c => c . Name . Equals ( "id" , StringComparison . OrdinalIgnoreCase ) ) ;
229251 if ( idColumn is not null )
230- return GetCsharpType ( idColumn ) ;
252+ return GetCsharpType ( idColumn , query ) ;
231253
232254 idColumn = tableColumns . First ( c => c . Name . Contains ( "id" , StringComparison . CurrentCultureIgnoreCase ) ) ;
233- return GetCsharpType ( idColumn ?? tableColumns [ 0 ] ) ;
255+ return GetCsharpType ( idColumn ?? tableColumns [ 0 ] , query ) ;
234256 }
235257
236258 public virtual string [ ] GetLastIdStatement ( Query query )
@@ -243,10 +265,10 @@ public virtual string[] GetLastIdStatement(Query query)
243265 ] ;
244266 }
245267
246- public Column GetColumnFromParam ( Parameter queryParam )
268+ public Column GetColumnFromParam ( Parameter queryParam , Query query )
247269 {
248270 if ( string . IsNullOrEmpty ( queryParam . Column . Name ) )
249- queryParam . Column . Name = $ "{ GetCsharpType ( queryParam . Column ) . Replace ( "[]" , "Arr" ) } _{ queryParam . Number } ";
271+ queryParam . Column . Name = $ "{ GetCsharpType ( queryParam . Column , query ) . Replace ( "[]" , "Arr" ) } _{ queryParam . Number } ";
250272 return queryParam . Column ;
251273 }
252274
@@ -262,4 +284,9 @@ protected bool BatchQueryExists()
262284 {
263285 return Queries . Any ( q => q . Cmd is ":copyfrom" ) ;
264286 }
287+
288+ private OverrideOption ? FindOverrideForQueryColumn ( Query query , Column column )
289+ {
290+ return Options . Overrides . FirstOrDefault ( o => o . Column . Equals ( $ "{ query . Name } :{ column . Name } ") ) ;
291+ }
265292}
0 commit comments