88using System . Collections . Generic ;
99using System . Diagnostics ;
1010using System . Linq . Expressions ;
11- using Xtensive . Collections ;
1211using Xtensive . Core ;
1312
1413using Xtensive . Tuples ;
@@ -27,8 +26,6 @@ namespace Xtensive.Orm.Rse.Providers
2726 public sealed class IncludeProvider : UnaryProvider ,
2827 IInlinableProvider
2928 {
30- private readonly int [ ] filteredColumns ;
31-
3229 /// <summary>
3330 /// Gets a value indicating whether result column should be inlined.
3431 /// </summary>
@@ -40,18 +37,15 @@ public sealed class IncludeProvider: UnaryProvider,
4037 public string ResultColumnName { get ; private set ; }
4138
4239 /// <summary>
43- /// Gets the algorithm that performes filtering.
40+ /// Gets the algorithm that performs filtering.
4441 /// For non-SQL storages value of this field has no effect.
4542 /// </summary>
4643 public IncludeAlgorithm Algorithm { get ; private set ; }
4744
4845 /// <summary>
4946 /// Gets the filtered columns.
5047 /// </summary>
51- public int [ ] FilteredColumns {
52- [ DebuggerStepThrough ]
53- get { return filteredColumns . Copy ( ) ; }
54- }
48+ public IReadOnlyList < int > FilteredColumns { [ DebuggerStepThrough ] get ; }
5549
5650 /// <summary>
5751 /// Gets filter data.
@@ -69,9 +63,10 @@ public int[] FilteredColumns {
6963 protected override RecordSetHeader BuildHeader ( )
7064 {
7165 var newHeader = Source . Header . Add ( new SystemColumn ( ResultColumnName , 0 , BoolType ) ) ;
72- var fieldTypes = FilteredColumns
73- . Select ( m => newHeader . Columns [ m ] . Type )
74- . ToArray ( FilteredColumns . Length ) ;
66+ var fieldTypes = new Type [ FilteredColumns . Count ] ;
67+ for ( var index = 0 ; index < fieldTypes . Length ; index ++ ) {
68+ fieldTypes [ index ] = newHeader . Columns [ FilteredColumns [ index ] ] . Type ;
69+ }
7570 var tupleDescriptor = TupleDescriptor . Create ( fieldTypes ) ;
7671 FilteredColumnsExtractionTransform = new MapTransform ( true , tupleDescriptor , FilteredColumns ) ;
7772 ResultTransform = new CombineTransform ( true , Source . Header . TupleDescriptor , BoolTupleDescriptor ) ;
@@ -91,7 +86,7 @@ protected override RecordSetHeader BuildHeader()
9186 /// <param name="resultColumnName">A value for <see cref="ResultColumnName"/>.</param>
9287 /// <param name="filteredColumns">A value for <see cref="FilteredColumns"/>.</param>
9388 public IncludeProvider ( CompilableProvider source , IncludeAlgorithm algorithm , bool isInlined ,
94- Expression < Func < IEnumerable < Tuple > > > filterDataSource , string resultColumnName , int [ ] filteredColumns )
89+ Expression < Func < IEnumerable < Tuple > > > filterDataSource , string resultColumnName , IReadOnlyList < int > filteredColumns )
9590 : base ( ProviderType . Include , source )
9691 {
9792 ArgumentValidator . EnsureArgumentNotNull ( filterDataSource , "filterDataSource" ) ;
@@ -101,8 +96,20 @@ public IncludeProvider(CompilableProvider source, IncludeAlgorithm algorithm, bo
10196 IsInlined = isInlined ;
10297 FilterDataSource = filterDataSource ;
10398 ResultColumnName = resultColumnName ;
104- this . filteredColumns = filteredColumns . Copy ( ) ;
99+
100+ switch ( filteredColumns ) {
101+ case int [ ] columnArray :
102+ FilteredColumns = Array . AsReadOnly ( columnArray ) ;
103+ break ;
104+ case List < int > columnList :
105+ FilteredColumns = columnList . AsReadOnly ( ) ;
106+ break ;
107+ default :
108+ FilteredColumns = filteredColumns ;
109+ break ;
110+ }
111+
105112 Initialize ( ) ;
106113 }
107114 }
108- }
115+ }
0 commit comments