Skip to content

Commit e0adb6b

Browse files
committed
Improve performance of EntityFieldExpression.CreateEntityField method
1 parent e34e33d commit e0adb6b

File tree

3 files changed

+25
-16
lines changed

3 files changed

+25
-16
lines changed

Orm/Xtensive.Orm/Orm/Linq/Expressions/EntityFieldExpression.cs

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -161,16 +161,22 @@ public override FieldExpression RemoveOwner()
161161

162162
public static EntityFieldExpression CreateEntityField(FieldInfo entityField, int offset)
163163
{
164-
if (!entityField.IsEntity)
165-
throw new ArgumentException(string.Format(Strings.ExFieldXIsNotEntity, entityField.Name), "entityField");
164+
if (!entityField.IsEntity) {
165+
throw new ArgumentException(string.Format(Strings.ExFieldXIsNotEntity, entityField.Name), nameof(entityField));
166+
}
167+
166168
var entityType = entityField.ValueType;
167169
var persistentType = entityField.ReflectedType.Model.Types[entityType];
168-
var mapping = new Segment<int>(entityField.MappingInfo.Offset + offset, entityField.MappingInfo.Length);
169-
var fields = new List<PersistentFieldExpression>();
170-
var keyExpression = KeyExpression.Create(persistentType, offset + entityField.MappingInfo.Offset);
171-
fields.Add(keyExpression);
172-
foreach (var keyField in persistentType.Fields.Where(f => f.IsPrimaryKey))
173-
fields.Add(BuildNestedFieldExpression(keyField, offset + entityField.MappingInfo.Offset));
170+
171+
ref var mappingInfo = ref entityField.mappingInfo;
172+
var mapping = new Segment<int>(mappingInfo.Offset + offset, mappingInfo.Length);
173+
var keyFields = persistentType.Key.Fields;
174+
var keyExpression = KeyExpression.Create(persistentType, offset + mappingInfo.Offset);
175+
var fields = new List<PersistentFieldExpression>(keyFields.Count + 1) {keyExpression};
176+
foreach (var field in keyFields) {
177+
fields.Add(BuildNestedFieldExpression(field, offset + mappingInfo.Offset));
178+
}
179+
174180
return new EntityFieldExpression(persistentType, entityField, fields, mapping, keyExpression, null, null, false);
175181
}
176182

Orm/Xtensive.Orm/Orm/Linq/Expressions/FieldExpression.cs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -119,9 +119,12 @@ public virtual FieldExpression RemoveOwner()
119119

120120
public static FieldExpression CreateField(FieldInfo field, int offset)
121121
{
122-
if (!field.IsPrimitive)
122+
if (!field.IsPrimitive) {
123123
throw new ArgumentException(string.Format(Strings.ExFieldXIsNotPrimitive, field.Name), "field");
124-
var mapping = new Segment<int>(field.MappingInfo.Offset + offset, field.MappingInfo.Length);
124+
}
125+
126+
ref var mappingInfo = ref field.mappingInfo;
127+
var mapping = new Segment<int>(mappingInfo.Offset + offset, mappingInfo.Length);
125128
return new FieldExpression(ExtendedExpressionType.Field, field, mapping, null, false);
126129
}
127130

Orm/Xtensive.Orm/Orm/Model/FieldInfo.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ public sealed class FieldInfo : MappedNode,
6060
private int? cachedHashCode;
6161

6262
private IList<IPropertyValidator> validators;
63-
private Segment<int> mappingInfo;
63+
internal Segment<int> mappingInfo;
6464

6565
#region IsXxx properties
6666

@@ -720,14 +720,14 @@ private void CreateMappingInfo()
720720
mappingInfo = new Segment<int>(primaryIndex.Columns.IndexOf(indexColumn), 1);
721721
}
722722
}
723-
else
724-
if (Fields.Count > 0)
725-
mappingInfo = new Segment<int>(
726-
Fields.First().MappingInfo.Offset, Fields.Sum(f => f.IsPrimitive ? f.MappingInfo.Length : 0));
723+
else if (Fields.Count > 0) {
724+
mappingInfo = new Segment<int>(
725+
Fields[0].mappingInfo.Offset, Fields.Sum(f => f.IsPrimitive ? f.mappingInfo.Length : 0));
726+
}
727727

728728
if (IsEntity || IsStructure) {
729729
valueExtractor = new SegmentTransform(
730-
false, reflectedType.TupleDescriptor, new Segment<int>(MappingInfo.Offset, MappingInfo.Length));
730+
false, reflectedType.TupleDescriptor, new Segment<int>(mappingInfo.Offset, mappingInfo.Length));
731731
}
732732
}
733733

0 commit comments

Comments
 (0)