@@ -17,14 +17,14 @@ namespace Xtensive.Orm.Linq.Expressions
1717 internal sealed class StructureFieldExpression : FieldExpression ,
1818 IPersistentExpression
1919 {
20- private List < PersistentFieldExpression > fields ;
20+ private IReadOnlyList < PersistentFieldExpression > fields ;
2121 public TypeInfo PersistentType { get ; }
2222
2323 public bool IsNullable => Owner != null && Owner . IsNullable ;
2424
2525 public IReadOnlyList < PersistentFieldExpression > Fields => fields ;
2626
27- private void SetFields ( List < PersistentFieldExpression > value )
27+ private void SetFields ( IReadOnlyList < PersistentFieldExpression > value )
2828 {
2929 fields = value ;
3030 foreach ( var fieldExpression in fields . OfType < FieldExpression > ( ) ) {
@@ -103,10 +103,11 @@ public override StructureFieldExpression BindParameter(ParameterExpression param
103103
104104 var result = new StructureFieldExpression ( PersistentType , Field , Mapping , OuterParameter , DefaultIfEmpty ) ;
105105 processedExpressions . Add ( this , result ) ;
106- var processedFields = new List < PersistentFieldExpression > ( fields . Count ) ;
106+ var processedFields = new PersistentFieldExpression [ fields . Count ] ;
107+ int i = 0 ;
107108 foreach ( var field in fields ) {
108109 // Do not convert to LINQ. We want to avoid a closure creation here.
109- processedFields . Add ( ( PersistentFieldExpression ) field . BindParameter ( parameter , processedExpressions ) ) ;
110+ processedFields [ i ++ ] = ( PersistentFieldExpression ) field . BindParameter ( parameter , processedExpressions ) ;
110111 }
111112
112113 if ( Owner == null ) {
@@ -127,10 +128,11 @@ public override Expression RemoveOuterParameter(Dictionary<Expression, Expressio
127128
128129 var result = new StructureFieldExpression ( PersistentType , Field , Mapping , OuterParameter , DefaultIfEmpty ) ;
129130 processedExpressions . Add ( this , result ) ;
130- var processedFields = new List < PersistentFieldExpression > ( fields . Count ) ;
131+ var processedFields = new PersistentFieldExpression [ fields . Count ] ;
132+ int i = 0 ;
131133 foreach ( var field in fields ) {
132134 // Do not convert to LINQ. We want to avoid a closure creation here.
133- processedFields . Add ( ( PersistentFieldExpression ) field . RemoveOuterParameter ( processedExpressions ) ) ;
135+ processedFields [ i ++ ] = ( PersistentFieldExpression ) field . RemoveOuterParameter ( processedExpressions ) ;
134136 }
135137
136138 if ( Owner == null ) {
@@ -149,14 +151,9 @@ public override FieldExpression RemoveOwner()
149151 return this ;
150152 }
151153
152- var result = new StructureFieldExpression ( PersistentType , Field , Mapping , OuterParameter , DefaultIfEmpty ) {
153- fields = new List < PersistentFieldExpression > ( fields . Count )
154+ return new StructureFieldExpression ( PersistentType , Field , Mapping , OuterParameter , DefaultIfEmpty ) {
155+ fields = fields . Select ( o => ( ( FieldExpression ) o ) . RemoveOwner ( ) ) . ToArray ( )
154156 } ;
155- foreach ( var field in fields ) {
156- result . fields . Add ( ( ( FieldExpression ) field ) . RemoveOwner ( ) ) ;
157- }
158-
159- return result ;
160157 }
161158
162159 public static StructureFieldExpression CreateStructure ( FieldInfo structureField , ColNum offset )
@@ -213,4 +210,4 @@ private StructureFieldExpression(
213210 PersistentType = persistentType ;
214211 }
215212 }
216- }
213+ }
0 commit comments