Skip to content

Commit 3789b53

Browse files
committed
Less enumerations and memory used
1 parent 5bcabe7 commit 3789b53

File tree

1 file changed

+23
-17
lines changed

1 file changed

+23
-17
lines changed

Orm/Xtensive.Orm/Orm/Linq/Translator.Expressions.cs

Lines changed: 23 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)