@@ -164,7 +164,7 @@ public static (string Name, int Ordinal)[] GetOrdinalMapping(this IDataRecord re
164164 try
165165 {
166166 var q = cn
167- . Select ( n => ( Name : n , Ordinal : record . GetOrdinal ( n ) ) ) ;
167+ . Select ( n => ( Name : n , Ordinal : record . GetOrdinal ( n ) ) ) ; // Does do a case-insensitive search after a case-sensitive one.
168168
169169 if ( sort )
170170 q = q . OrderBy ( m => m . Ordinal ) ;
@@ -210,15 +210,31 @@ public static object[] GetValuesFromOrdinals(this IDataRecord record, params int
210210 public static ( string Name , int Ordinal ) [ ] GetMatchingOrdinals ( this IDataRecord record , IEnumerable < string > columnNames , bool sort = false )
211211 {
212212 if ( columnNames == null ) throw new ArgumentNullException ( nameof ( columnNames ) ) ;
213+
214+ // Normalize the requested column names to be lowercase.
215+ columnNames = columnNames . Select ( c =>
216+ {
217+ if ( string . IsNullOrWhiteSpace ( c ) )
218+ throw new ArgumentException ( "Column names cannot be null or whitespace only." ) ;
219+ return c . ToLowerInvariant ( ) ;
220+ } ) ;
221+
213222 var actual = record . GetOrdinalMapping ( ) ;
214223 if ( sort )
215224 {
216- var requested = columnNames as HashSet < string > ?? new HashSet < string > ( columnNames ) ;
217- return actual . Where ( m => requested . Contains ( m . Name ) ) . ToArray ( ) ;
225+ var requested = new HashSet < string > ( columnNames ) ;
226+ // Return actual values based upon if their lower-case counterparts exist in the requested.
227+ return actual
228+ . Where ( m => columnNames . Contains ( m . Name . ToLowerInvariant ( ) ) )
229+ . ToArray ( ) ;
218230 } else
219231 {
220- var actualColumns = actual . ToDictionary ( m => m . Name , m => m ) ;
221- return columnNames . Where ( c => actualColumns . ContainsKey ( c ) ) . Select ( c => actualColumns [ c ] ) . ToArray ( ) ;
232+ // Create a map of lower-case keys to acutal.
233+ var actualColumns = actual . ToDictionary ( m => m . Name . ToLowerInvariant ( ) , m => m ) ;
234+ return columnNames
235+ . Where ( c => actualColumns . ContainsKey ( c ) ) // Select lower case column names if they exist in the dictionary.
236+ . Select ( c => actualColumns [ c ] ) // Then select the actual values based upon that key.
237+ . ToArray ( ) ;
222238 }
223239 }
224240
0 commit comments