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.
@@ -66,9 +60,13 @@ public int[] FilteredColumns {
6660 protected override RecordSetHeader BuildHeader ( )
6761 {
6862 var newHeader = Source . Header . Add ( new SystemColumn ( ResultColumnName , 0 , typeof ( bool ) ) ) ;
69- var types = FilteredColumns . Select ( m => newHeader . Columns [ m ] . Type ) ;
70- FilteredColumnsExtractionTransform = new MapTransform ( true , TupleDescriptor . Create ( types ) , FilteredColumns ) ;
71- ResultTransform = new CombineTransform ( true , Source . Header . TupleDescriptor , TupleDescriptor . Create ( new [ ] { typeof ( bool ) } ) ) ;
63+ var fieldTypes = new Type [ FilteredColumns . Count ] ;
64+ for ( var index = 0 ; index < fieldTypes . Length ; index ++ ) {
65+ fieldTypes [ index ] = newHeader . Columns [ FilteredColumns [ index ] ] . Type ;
66+ }
67+ var tupleDescriptor = TupleDescriptor . Create ( fieldTypes ) ;
68+ FilteredColumnsExtractionTransform = new MapTransform ( true , tupleDescriptor , FilteredColumns ) ;
69+ ResultTransform = new CombineTransform ( true , Source . Header . TupleDescriptor , TupleDescriptor . Create < bool > ( ) ) ;
7270 return newHeader ;
7371 }
7472
@@ -85,7 +83,7 @@ protected override RecordSetHeader BuildHeader()
8583 /// <param name="resultColumnName">A value for <see cref="ResultColumnName"/>.</param>
8684 /// <param name="filteredColumns">A value for <see cref="FilteredColumns"/>.</param>
8785 public IncludeProvider ( CompilableProvider source , IncludeAlgorithm algorithm , bool isInlined ,
88- Expression < Func < IEnumerable < Tuple > > > filterDataSource , string resultColumnName , int [ ] filteredColumns )
86+ Expression < Func < IEnumerable < Tuple > > > filterDataSource , string resultColumnName , IReadOnlyList < int > filteredColumns )
8987 : base ( ProviderType . Include , source )
9088 {
9189 ArgumentValidator . EnsureArgumentNotNull ( filterDataSource , "filterDataSource" ) ;
@@ -95,7 +93,7 @@ public IncludeProvider(CompilableProvider source, IncludeAlgorithm algorithm, bo
9593 IsInlined = isInlined ;
9694 FilterDataSource = filterDataSource ;
9795 ResultColumnName = resultColumnName ;
98- this . filteredColumns = filteredColumns . Copy ( ) ;
96+ FilteredColumns = filteredColumns is int [ ] columns ? Array . AsReadOnly ( columns ) : filteredColumns ;
9997 Initialize ( ) ;
10098 }
10199 }
0 commit comments