@@ -129,10 +129,12 @@ protected override SqlProvider VisitDistinct(DistinctProvider provider)
129129 if ( ! sourceSelect . Limit . IsNullReference ( ) || ! sourceSelect . Offset . IsNullReference ( ) ) {
130130 var queryRef = SqlDml . QueryRef ( sourceSelect ) ;
131131 query = SqlDml . Select ( queryRef ) ;
132- query . Columns . AddRange ( queryRef . Columns . Cast < SqlColumn > ( ) ) ;
132+ query . Columns . AddRange ( queryRef . Columns ) ;
133133 }
134- else
134+ else {
135135 query = sourceSelect . ShallowClone ( ) ;
136+ }
137+
136138 query . Distinct = true ;
137139 return CreateProvider ( query , provider , source ) ;
138140 }
@@ -173,7 +175,7 @@ protected override SqlProvider VisitJoin(JoinProvider provider)
173175 ? left . PermanentReference
174176 : left . Request . Statement . From ;
175177 var leftColumns = leftShouldUseReference
176- ? leftTable . Columns . Cast < SqlColumn > ( )
178+ ? ( IReadOnlyList < SqlColumn > ) leftTable . Columns
177179 : left . Request . Statement . Columns ;
178180 var leftExpressions = leftShouldUseReference
179181 ? leftTable . Columns . Cast < SqlExpression > ( ) . ToList ( )
@@ -184,7 +186,7 @@ protected override SqlProvider VisitJoin(JoinProvider provider)
184186 ? right . PermanentReference
185187 : right . Request . Statement . From ;
186188 var rightColumns = rightShouldUseReference
187- ? rightTable . Columns . Cast < SqlColumn > ( )
189+ ? ( IReadOnlyList < SqlColumn > ) rightTable . Columns
188190 : right . Request . Statement . Columns ;
189191 var rightExpressions = rightShouldUseReference
190192 ? rightTable . Columns . Cast < SqlExpression > ( ) . ToList ( )
@@ -205,8 +207,8 @@ protected override SqlProvider VisitJoin(JoinProvider provider)
205207 joinType ,
206208 leftTable ,
207209 rightTable ,
208- leftColumns . ToList ( ) ,
209- rightColumns . ToList ( ) ,
210+ leftColumns ,
211+ rightColumns ,
210212 joinExpression ) ;
211213
212214 var query = SqlDml . Select ( joinedTable ) ;
@@ -229,21 +231,21 @@ protected override SqlProvider VisitPredicateJoin(PredicateJoinProvider provider
229231 ? left . PermanentReference
230232 : left . Request . Statement . From ;
231233 var leftColumns = leftShouldUseReference
232- ? leftTable . Columns . Cast < SqlColumn > ( )
234+ ? ( IReadOnlyList < SqlColumn > ) leftTable . Columns
233235 : left . Request . Statement . Columns ;
234236 var leftExpressions = leftShouldUseReference
235- ? leftTable . Columns . Cast < SqlExpression > ( ) . ToList ( )
237+ ? ( IReadOnlyList < SqlExpression > ) leftTable . Columns
236238 : ExtractColumnExpressions ( left . Request . Statement ) ;
237239
238240 var rightShouldUseReference = ShouldUseQueryReference ( provider , right ) ;
239241 var rightTable = rightShouldUseReference
240242 ? right . PermanentReference
241243 : right . Request . Statement . From ;
242244 var rightColumns = rightShouldUseReference
243- ? rightTable . Columns . Cast < SqlColumn > ( )
245+ ? ( IReadOnlyList < SqlColumn > ) rightTable . Columns
244246 : right . Request . Statement . Columns ;
245247 var rightExpressions = rightShouldUseReference
246- ? rightTable . Columns . Cast < SqlExpression > ( ) . ToList ( )
248+ ? ( IReadOnlyList < SqlExpression > ) rightTable . Columns
247249 : ExtractColumnExpressions ( right . Request . Statement ) ;
248250
249251
@@ -257,8 +259,8 @@ protected override SqlProvider VisitPredicateJoin(PredicateJoinProvider provider
257259 joinType ,
258260 leftTable ,
259261 rightTable ,
260- leftColumns . ToList ( ) ,
261- rightColumns . ToList ( ) ,
262+ leftColumns ,
263+ rightColumns ,
262264 joinExpression ) ;
263265
264266 var query = SqlDml . Select ( joinedTable ) ;
@@ -308,10 +310,18 @@ protected override SqlProvider VisitSelect(SelectProvider provider)
308310 {
309311 var compiledSource = Compile ( provider . Source ) ;
310312
311- SqlSelect query = ExtractSqlSelect ( provider , compiledSource ) ;
312- var originalColumns = query . Columns . ToList ( ) ;
313- query . Columns . Clear ( ) ;
314- query . Columns . AddRange ( provider . ColumnIndexes . Select ( i => originalColumns [ i ] ) ) ;
313+ var query = ExtractSqlSelect ( provider , compiledSource ) ;
314+ var queryColumns = query . Columns ;
315+ var columnIndexes = provider . ColumnIndexes ;
316+
317+ var newIndex = 0 ;
318+ var newColumns = new SqlColumn [ columnIndexes . Count ] ;
319+ foreach ( var index in columnIndexes ) {
320+ newColumns [ newIndex ++ ] = queryColumns [ index ] ;
321+ }
322+
323+ queryColumns . Clear ( ) ;
324+ queryColumns . AddRange ( newColumns ) ;
315325
316326 return CreateProvider ( query , provider , compiledSource ) ;
317327 }
@@ -407,7 +417,7 @@ protected override SqlProvider VisitIntersect(IntersectProvider provider)
407417 var queryRef = SqlDml . QueryRef ( result ) ;
408418
409419 SqlSelect query = SqlDml . Select ( queryRef ) ;
410- query . Columns . AddRange ( queryRef . Columns . Cast < SqlColumn > ( ) ) ;
420+ query . Columns . AddRange ( queryRef . Columns ) ;
411421
412422 return CreateProvider ( query , provider , left , right ) ;
413423 }
@@ -431,7 +441,7 @@ protected override SqlProvider VisitExcept(ExceptProvider provider)
431441 var result = SqlDml . Except ( leftSelect , rightSelect ) ;
432442 var queryRef = SqlDml . QueryRef ( result ) ;
433443 SqlSelect query = SqlDml . Select ( queryRef ) ;
434- query . Columns . AddRange ( queryRef . Columns . Cast < SqlColumn > ( ) ) ;
444+ query . Columns . AddRange ( queryRef . Columns ) ;
435445
436446 return CreateProvider ( query , provider , left , right ) ;
437447 }
@@ -455,7 +465,7 @@ protected override SqlProvider VisitConcat(ConcatProvider provider)
455465 var result = SqlDml . UnionAll ( leftSelect , rightSelect ) ;
456466 var queryRef = SqlDml . QueryRef ( result ) ;
457467 SqlSelect query = SqlDml . Select ( queryRef ) ;
458- query . Columns . AddRange ( queryRef . Columns . Cast < SqlColumn > ( ) ) ;
468+ query . Columns . AddRange ( queryRef . Columns ) ;
459469
460470 return CreateProvider ( query , provider , left , right ) ;
461471 }
@@ -479,7 +489,7 @@ protected override SqlProvider VisitUnion(UnionProvider provider)
479489 var result = SqlDml . Union ( leftSelect , rightSelect ) ;
480490 var queryRef = SqlDml . QueryRef ( result ) ;
481491 SqlSelect query = SqlDml . Select ( queryRef ) ;
482- query . Columns . AddRange ( queryRef . Columns . Cast < SqlColumn > ( ) ) ;
492+ query . Columns . AddRange ( queryRef . Columns ) ;
483493
484494 return CreateProvider ( query , provider , left , right ) ;
485495 }
0 commit comments