@@ -820,9 +820,8 @@ private Expression VisitBinaryRecursive(BinaryExpression binaryExpression, Binar
820820 // Check key compatibility
821821 leftKeyExpression . EnsureKeyExpressionCompatible ( rightKeyExpression , originalBinaryExpression ) ;
822822 // Key split to it's fields.
823- IEnumerable < Type > keyFields = ( leftKeyExpression ?? rightKeyExpression )
824- . KeyFields
825- . Select ( fieldExpression => fieldExpression . Type ) ;
823+ IReadOnlyList < FieldExpression > keyFields = ( leftKeyExpression ?? rightKeyExpression )
824+ . KeyFields ;
826825 leftExpressions = GetKeyFields ( left , keyFields ) ;
827826 rightExpressions = GetKeyFields ( right , keyFields ) ;
828827 break ;
@@ -1096,23 +1095,28 @@ private IList<Expression> GetEntityFields(Expression expression, IReadOnlyList<T
10961095 {
10971096 expression = expression . StripCasts ( ) ;
10981097 if ( expression is IEntityExpression iEntityExpression ) {
1099- return GetKeyFields ( iEntityExpression . Key , null ) ;
1098+ var keyFields = iEntityExpression . Key . KeyFields ;
1099+ return keyFields
1100+ . Cast < Expression > ( )
1101+ . ToArray ( keyFields . Count ) ;
11001102 }
11011103 if ( expression . IsNull ( ) ) {
1102- return GetKeyFields ( Expression . Constant ( null , WellKnownOrmTypes . Key ) , keyFieldTypes ) ;
1104+ return keyFieldTypes
1105+ . Select ( type => ( Expression ) Expression . Constant ( null , type . ToNullable ( ) ) )
1106+ . ToArray ( keyFieldTypes . Count ) ;
11031107 }
11041108 if ( IsConditionalOrWellknown ( expression ) ) {
11051109 return keyFieldTypes
11061110 . Select ( ( type , index ) => GetConditionalKeyField ( expression , type , index ) )
1107- . ToList ( keyFieldTypes . Count ) ;
1111+ . ToArray ( keyFieldTypes . Count ) ;
11081112 }
11091113
11101114 var nullEntityExpression = Expression . Constant ( null , expression . Type ) ;
11111115 var isNullExpression = Expression . Equal ( expression , nullEntityExpression ) ;
11121116 if ( ! WellKnownOrmInterfaces . Entity . IsAssignableFrom ( expression . Type ) )
11131117 expression = Expression . Convert ( expression , WellKnownOrmInterfaces . Entity ) ;
11141118
1115- var resultList = new List < Expression > ( keyFieldTypes . Count ) ;
1119+ var resultList = new Expression [ keyFieldTypes . Count ] ;
11161120 for ( int i = 0 , count = keyFieldTypes . Count ; i < count ; i ++ ) {
11171121 var keyFieldType = keyFieldTypes [ i ] ;
11181122 var baseType = keyFieldType . StripNullable ( ) ;
@@ -1125,7 +1129,7 @@ private IList<Expression> GetEntityFields(Expression expression, IReadOnlyList<T
11251129 isNullExpression ,
11261130 Expression . Constant ( null , keyFieldType . ToNullable ( ) ) ,
11271131 tupleAccess ) ;
1128- resultList . Add ( entityNullCheck ) ;
1132+ resultList [ i ] = entityNullCheck ;
11291133 _ = state . NonVisitableExpressions . Add ( entityNullCheck ) ;
11301134 }
11311135 return resultList ;
@@ -1144,27 +1148,29 @@ private static Expression GetConditionalKeyField(Expression expression, Type key
11441148 return ee . Key . KeyFields [ index ] . LiftToNullable ( ) ;
11451149 }
11461150
1147- private IList < Expression > GetKeyFields ( Expression expression , IEnumerable < Type > keyFieldTypes )
1151+ private IList < Expression > GetKeyFields ( Expression expression , IReadOnlyList < FieldExpression > keyFields /* IEnumerable<Type> keyFieldTypes*/ )
11481152 {
11491153 expression = expression . StripCasts ( ) ;
11501154
11511155 if ( expression is KeyExpression keyExpression ) {
11521156 return keyExpression
11531157 . KeyFields
11541158 . Cast < Expression > ( )
1155- . ToList ( keyExpression . KeyFields . Count ) ;
1159+ . ToArray ( keyExpression . KeyFields . Count ) ;
11561160 }
11571161
11581162 if ( expression . IsNull ( ) )
1159- return keyFieldTypes
1163+ return keyFields
1164+ . Select ( f => f . Type )
11601165 . Select ( type => ( Expression ) Expression . Constant ( null , type . ToNullable ( ) ) )
1161- . ToList ( ) ;
1166+ . ToArray ( keyFields . Count ) ;
11621167
11631168 var nullExpression = Expression . Constant ( null , expression . Type ) ;
11641169 var isNullExpression = Expression . Equal ( expression , nullExpression ) ;
11651170 var keyTupleExpression = Expression . MakeMemberAccess ( expression , WellKnownMembers . Key . Value ) ;
11661171
1167- return keyFieldTypes
1172+ return keyFields
1173+ . Select ( f => f . Type )
11681174 . Select ( ( type , index ) => {
11691175 var resultType = type . ToNullable ( ) ;
11701176 var baseType = type . StripNullable ( ) ;
@@ -1176,7 +1182,7 @@ private IList<Expression> GetKeyFields(Expression expression, IEnumerable<Type>
11761182 _ = state . NonVisitableExpressions . Add ( checkForNulls ) ;
11771183 return checkForNulls ;
11781184 } )
1179- . ToList ( ) ;
1185+ . ToArray ( keyFields . Count ) ;
11801186 }
11811187
11821188 private Expression ProcessProjectionElement ( Expression body )
@@ -1304,7 +1310,7 @@ private static IList<Expression> GetAnonymousArguments(Expression expression, Ty
13041310 . Select ( ( methodInfo , index ) => new { methodInfo . Name , Argument = newExpression . Arguments [ index ] } )
13051311 . OrderBy ( a => a . Name )
13061312 . Select ( a => a . Argument ) ;
1307- return arguments . ToList ( newExpression . Members . Count ) ;
1313+ return arguments . ToArray ( newExpression . Members . Count ) ;
13081314 }
13091315
13101316 if ( expression . NodeType == ExpressionType . Constant ) {
@@ -1319,7 +1325,7 @@ private static IList<Expression> GetAnonymousArguments(Expression expression, Ty
13191325
13201326 return orderedProps1
13211327 . Select ( p => ( Expression ) Expression . MakeMemberAccess ( constantExpression , p ) )
1322- . ToList ( orderedProps1 . Length ) ;
1328+ . ToArray ( orderedProps1 . Length ) ;
13231329 }
13241330 }
13251331
@@ -1330,7 +1336,7 @@ private static IList<Expression> GetAnonymousArguments(Expression expression, Ty
13301336
13311337 return orderedProps
13321338 . Select ( p => ( Expression ) Expression . MakeMemberAccess ( expression , p ) )
1333- . ToList ( orderedProps . Length ) ;
1339+ . ToArray ( orderedProps . Length ) ;
13341340
13351341 static int CompareProps ( PropertyInfo p1 , PropertyInfo p2 )
13361342 {
0 commit comments