@@ -820,9 +820,8 @@ private Expression VisitBinaryRecursive(BinaryExpression binaryExpression, Binar
820
820
// Check key compatibility
821
821
leftKeyExpression . EnsureKeyExpressionCompatible ( rightKeyExpression , originalBinaryExpression ) ;
822
822
// 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 ;
826
825
leftExpressions = GetKeyFields ( left , keyFields ) ;
827
826
rightExpressions = GetKeyFields ( right , keyFields ) ;
828
827
break ;
@@ -1096,23 +1095,28 @@ private IList<Expression> GetEntityFields(Expression expression, IReadOnlyList<T
1096
1095
{
1097
1096
expression = expression . StripCasts ( ) ;
1098
1097
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 ) ;
1100
1102
}
1101
1103
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 ) ;
1103
1107
}
1104
1108
if ( IsConditionalOrWellknown ( expression ) ) {
1105
1109
return keyFieldTypes
1106
1110
. Select ( ( type , index ) => GetConditionalKeyField ( expression , type , index ) )
1107
- . ToList ( keyFieldTypes . Count ) ;
1111
+ . ToArray ( keyFieldTypes . Count ) ;
1108
1112
}
1109
1113
1110
1114
var nullEntityExpression = Expression . Constant ( null , expression . Type ) ;
1111
1115
var isNullExpression = Expression . Equal ( expression , nullEntityExpression ) ;
1112
1116
if ( ! WellKnownOrmInterfaces . Entity . IsAssignableFrom ( expression . Type ) )
1113
1117
expression = Expression . Convert ( expression , WellKnownOrmInterfaces . Entity ) ;
1114
1118
1115
- var resultList = new List < Expression > ( keyFieldTypes . Count ) ;
1119
+ var resultList = new Expression [ keyFieldTypes . Count ] ;
1116
1120
for ( int i = 0 , count = keyFieldTypes . Count ; i < count ; i ++ ) {
1117
1121
var keyFieldType = keyFieldTypes [ i ] ;
1118
1122
var baseType = keyFieldType . StripNullable ( ) ;
@@ -1125,7 +1129,7 @@ private IList<Expression> GetEntityFields(Expression expression, IReadOnlyList<T
1125
1129
isNullExpression ,
1126
1130
Expression . Constant ( null , keyFieldType . ToNullable ( ) ) ,
1127
1131
tupleAccess ) ;
1128
- resultList . Add ( entityNullCheck ) ;
1132
+ resultList [ i ] = entityNullCheck ;
1129
1133
_ = state . NonVisitableExpressions . Add ( entityNullCheck ) ;
1130
1134
}
1131
1135
return resultList ;
@@ -1144,27 +1148,29 @@ private static Expression GetConditionalKeyField(Expression expression, Type key
1144
1148
return ee . Key . KeyFields [ index ] . LiftToNullable ( ) ;
1145
1149
}
1146
1150
1147
- private IList < Expression > GetKeyFields ( Expression expression , IEnumerable < Type > keyFieldTypes )
1151
+ private IList < Expression > GetKeyFields ( Expression expression , IReadOnlyList < FieldExpression > keyFields /* IEnumerable<Type> keyFieldTypes*/ )
1148
1152
{
1149
1153
expression = expression . StripCasts ( ) ;
1150
1154
1151
1155
if ( expression is KeyExpression keyExpression ) {
1152
1156
return keyExpression
1153
1157
. KeyFields
1154
1158
. Cast < Expression > ( )
1155
- . ToList ( keyExpression . KeyFields . Count ) ;
1159
+ . ToArray ( keyExpression . KeyFields . Count ) ;
1156
1160
}
1157
1161
1158
1162
if ( expression . IsNull ( ) )
1159
- return keyFieldTypes
1163
+ return keyFields
1164
+ . Select ( f => f . Type )
1160
1165
. Select ( type => ( Expression ) Expression . Constant ( null , type . ToNullable ( ) ) )
1161
- . ToList ( ) ;
1166
+ . ToArray ( keyFields . Count ) ;
1162
1167
1163
1168
var nullExpression = Expression . Constant ( null , expression . Type ) ;
1164
1169
var isNullExpression = Expression . Equal ( expression , nullExpression ) ;
1165
1170
var keyTupleExpression = Expression . MakeMemberAccess ( expression , WellKnownMembers . Key . Value ) ;
1166
1171
1167
- return keyFieldTypes
1172
+ return keyFields
1173
+ . Select ( f => f . Type )
1168
1174
. Select ( ( type , index ) => {
1169
1175
var resultType = type . ToNullable ( ) ;
1170
1176
var baseType = type . StripNullable ( ) ;
@@ -1176,7 +1182,7 @@ private IList<Expression> GetKeyFields(Expression expression, IEnumerable<Type>
1176
1182
_ = state . NonVisitableExpressions . Add ( checkForNulls ) ;
1177
1183
return checkForNulls ;
1178
1184
} )
1179
- . ToList ( ) ;
1185
+ . ToArray ( keyFields . Count ) ;
1180
1186
}
1181
1187
1182
1188
private Expression ProcessProjectionElement ( Expression body )
@@ -1304,7 +1310,7 @@ private static IList<Expression> GetAnonymousArguments(Expression expression, Ty
1304
1310
. Select ( ( methodInfo , index ) => new { methodInfo . Name , Argument = newExpression . Arguments [ index ] } )
1305
1311
. OrderBy ( a => a . Name )
1306
1312
. Select ( a => a . Argument ) ;
1307
- return arguments . ToList ( newExpression . Members . Count ) ;
1313
+ return arguments . ToArray ( newExpression . Members . Count ) ;
1308
1314
}
1309
1315
1310
1316
if ( expression . NodeType == ExpressionType . Constant ) {
@@ -1319,7 +1325,7 @@ private static IList<Expression> GetAnonymousArguments(Expression expression, Ty
1319
1325
1320
1326
return orderedProps1
1321
1327
. Select ( p => ( Expression ) Expression . MakeMemberAccess ( constantExpression , p ) )
1322
- . ToList ( orderedProps1 . Length ) ;
1328
+ . ToArray ( orderedProps1 . Length ) ;
1323
1329
}
1324
1330
}
1325
1331
@@ -1330,7 +1336,7 @@ private static IList<Expression> GetAnonymousArguments(Expression expression, Ty
1330
1336
1331
1337
return orderedProps
1332
1338
. Select ( p => ( Expression ) Expression . MakeMemberAccess ( expression , p ) )
1333
- . ToList ( orderedProps . Length ) ;
1339
+ . ToArray ( orderedProps . Length ) ;
1334
1340
1335
1341
static int CompareProps ( PropertyInfo p1 , PropertyInfo p2 )
1336
1342
{
0 commit comments