Skip to content

Commit a7ce858

Browse files
committed
CSHARP-1246: fixed issue where expressions including variables were not partially evaluated in a FieldDefinition.
1 parent ee619ce commit a7ce858

File tree

2 files changed

+13
-6
lines changed

2 files changed

+13
-6
lines changed

src/MongoDB.Driver.Tests/UpdateDefinitionBuilderTests.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -236,6 +236,11 @@ public void Indexed_Typed()
236236
Assert(subject.Set(x => x.FavoriteColors[2], "yellow"), "{$set: {'colors.2': 'yellow'}}");
237237
Assert(subject.Set(x => x.Pets[2].Name, "Fluffencutters"), "{$set: {'pets.2.name': 'Fluffencutters'}}");
238238
Assert(subject.Set(x => x.Pets.ElementAt(2).Name, "Fluffencutters"), "{$set: {'pets.2.name': 'Fluffencutters'}}");
239+
240+
var index = 2;
241+
Assert(subject.Set(x => x.FavoriteColors[index], "yellow"), "{$set: {'colors.2': 'yellow'}}");
242+
Assert(subject.Set(x => x.Pets[index].Name, "Fluffencutters"), "{$set: {'pets.2.name': 'Fluffencutters'}}");
243+
Assert(subject.Set(x => x.Pets.ElementAt(index).Name, "Fluffencutters"), "{$set: {'pets.2.name': 'Fluffencutters'}}");
239244
}
240245

241246
[Test]

src/MongoDB.Driver/FieldDefinition.cs

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -200,11 +200,12 @@ public LambdaExpression Expression
200200
/// <inheritdoc />
201201
public override RenderedFieldDefinition Render(IBsonSerializer<TDocument> documentSerializer, IBsonSerializerRegistry serializerRegistry)
202202
{
203+
var lambda = (LambdaExpression)PartialEvaluator.Evaluate(_expression);
203204
var binder = new SerializationInfoBinder(serializerRegistry);
204205
var parameterSerializationInfo = new BsonSerializationInfo(null, documentSerializer, documentSerializer.ValueType);
205-
var parameterExpression = new SerializationExpression(_expression.Parameters[0], parameterSerializationInfo);
206-
binder.RegisterParameterReplacement(_expression.Parameters[0], parameterExpression);
207-
var bound = binder.Bind(_expression.Body) as ISerializationExpression;
206+
var parameterExpression = new SerializationExpression(lambda.Parameters[0], parameterSerializationInfo);
207+
binder.RegisterParameterReplacement(lambda.Parameters[0], parameterExpression);
208+
var bound = binder.Bind(lambda.Body) as ISerializationExpression;
208209
if (bound == null)
209210
{
210211
var message = string.Format("Unable to determine the serialization information for {0}.", _expression);
@@ -244,11 +245,12 @@ public Expression<Func<TDocument, TField>> Expression
244245
/// <inheritdoc />
245246
public override RenderedFieldDefinition<TField> Render(IBsonSerializer<TDocument> documentSerializer, IBsonSerializerRegistry serializerRegistry)
246247
{
248+
var lambda = (LambdaExpression)PartialEvaluator.Evaluate(_expression);
247249
var binder = new SerializationInfoBinder(serializerRegistry);
248250
var parameterSerializationInfo = new BsonSerializationInfo(null, documentSerializer, documentSerializer.ValueType);
249-
var parameterExpression = new SerializationExpression(_expression.Parameters[0], parameterSerializationInfo);
250-
binder.RegisterParameterReplacement(_expression.Parameters[0], parameterExpression);
251-
var bound = binder.Bind(_expression.Body) as ISerializationExpression;
251+
var parameterExpression = new SerializationExpression(lambda.Parameters[0], parameterSerializationInfo);
252+
binder.RegisterParameterReplacement(lambda.Parameters[0], parameterExpression);
253+
var bound = binder.Bind(lambda.Body) as ISerializationExpression;
252254
if (bound == null)
253255
{
254256
var message = string.Format("Unable to determine the serialization information for {0}.", _expression);

0 commit comments

Comments
 (0)