Skip to content

Commit bbe4dec

Browse files
authored
Optimize FieldExpression construction (#385)
1 parent c0bb39f commit bbe4dec

File tree

4 files changed

+23
-44
lines changed

4 files changed

+23
-44
lines changed

Orm/Xtensive.Orm/Orm/Linq/Expressions/EntityExpression.cs

Lines changed: 6 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,6 @@
44
// Created by: Alexis Kochetov
55
// Created: 2009.05.05
66

7-
using System;
8-
using System.Linq;
9-
using System.Collections.Generic;
107
using System.Linq.Expressions;
118
using Xtensive.Orm.Model;
129
using Xtensive.Orm.Linq.Expressions.Visitors;
@@ -184,26 +181,11 @@ public static EntityExpression Create(EntityFieldExpression entityFieldExpressio
184181
entityFieldExpression.OuterParameter, new Dictionary<Expression, Expression>());
185182
}
186183

187-
private static PersistentFieldExpression BuildNestedFieldExpression(FieldInfo nestedField, ColNum offset)
188-
{
189-
if (nestedField.IsPrimitive) {
190-
return FieldExpression.CreateField(nestedField, offset);
191-
}
192-
193-
if (nestedField.IsStructure) {
194-
return StructureFieldExpression.CreateStructure(nestedField, offset);
195-
}
196-
197-
if (nestedField.IsEntity) {
198-
return EntityFieldExpression.CreateEntityField(nestedField, offset);
199-
}
200-
201-
if (nestedField.IsEntitySet) {
202-
return EntitySetExpression.CreateEntitySet(nestedField);
203-
}
204-
205-
throw new NotSupportedException(string.Format(Strings.ExNestedFieldXIsNotSupported, nestedField.Attributes));
206-
}
184+
private static PersistentFieldExpression BuildNestedFieldExpression(FieldInfo nestedField, ColNum offset) =>
185+
nestedField.IsStructure ? StructureFieldExpression.CreateStructure(nestedField, offset)
186+
: nestedField.IsEntity ? EntityFieldExpression.CreateEntityField(nestedField, offset)
187+
: nestedField.IsEntitySet ? EntitySetExpression.CreateEntitySet(nestedField)
188+
: FieldExpression.CreateField(nestedField, offset);
207189

208190
public override string ToString() => $"{base.ToString()} {PersistentType.Name}";
209191

@@ -222,4 +204,4 @@ private EntityExpression(
222204
Key = key;
223205
}
224206
}
225-
}
207+
}

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

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -162,10 +162,12 @@ public static EntityFieldExpression CreateEntityField(FieldInfo entityField, Col
162162
var mapping = new Segment<ColNum>((ColNum) (mappingInfo.Offset + offset), mappingInfo.Length);
163163
var keyFields = persistentType.Key.Fields;
164164
var keyExpression = KeyExpression.Create(persistentType, (ColNum) (offset + mappingInfo.Offset));
165-
var fields = new List<PersistentFieldExpression>(keyFields.Count + 1) { keyExpression };
165+
var fields = new PersistentFieldExpression[keyFields.Count + 1];
166+
fields[0] = keyExpression;
167+
int i = 1;
166168
foreach (var field in keyFields) {
167169
// Do not convert to LINQ. We want to avoid a closure creation here.
168-
fields.Add(BuildNestedFieldExpression(field, (ColNum) (offset + mappingInfo.Offset)));
170+
fields[i++] = BuildNestedFieldExpression(field, (ColNum) (offset + mappingInfo.Offset));
169171
}
170172

171173
return new EntityFieldExpression(persistentType, entityField, fields, mapping, keyExpression, null, null, false);
@@ -205,4 +207,4 @@ private EntityFieldExpression(
205207
Entity = entity;
206208
}
207209
}
208-
}
210+
}

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

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,6 @@
44
// Created by: Alexis Kochetov
55
// Created: 2009.05.05
66

7-
using System;
8-
using System.Collections.Generic;
97
using System.Linq.Expressions;
108
using Xtensive.Core;
119
using Xtensive.Orm.Linq.Expressions.Visitors;
@@ -137,4 +135,4 @@ protected FieldExpression(
137135
Field = field;
138136
}
139137
}
140-
}
138+
}

Orm/Xtensive.Orm/Orm/Linq/Expressions/StructureFieldExpression.cs

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

Comments
 (0)