Skip to content

Commit bea9346

Browse files
committed
CSHARP-1470: propogate embedded array field prefixes correctly.
1 parent 91f4c13 commit bea9346

File tree

3 files changed

+44
-6
lines changed

3 files changed

+44
-6
lines changed

src/MongoDB.Driver.Tests/Linq/MongoQueryableTests.cs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -864,6 +864,29 @@ from y in x.G
864864
"{ $project: { F: '$C.E.F', Other: '$G.D', _id: 0 } }");
865865
}
866866

867+
[Test]
868+
public void SelectMany_followed_by_a_group()
869+
{
870+
var first = from x in CreateQuery()
871+
from y in x.G
872+
select y;
873+
874+
var query = from f in first
875+
group f by f.D into g
876+
select new
877+
{
878+
g.Key,
879+
SumF = g.Sum(x => x.E.F)
880+
};
881+
882+
Assert(query,
883+
4,
884+
"{ $unwind: '$G' }",
885+
"{ $project: { G: 1, _id: 0 } }",
886+
"{ $group: { _id: '$G.D', __agg0: { $sum : '$G.E.F' } } }",
887+
"{ $project: { Key: '$_id', SumF: '$__agg0', _id: 0 } }");
888+
}
889+
867890
[Test]
868891
public void Single()
869892
{

src/MongoDB.Driver/Linq/Processors/EmbeddedPipeline/EmbeddedPipelineBinder.cs

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -85,9 +85,18 @@ protected override Expression BindNonMethodCall(Expression node)
8585
BsonSerializationInfo itemSerializationInfo;
8686
if (arraySerializer != null && arraySerializer.TryGetItemSerializationInfo(out itemSerializationInfo))
8787
{
88-
return new PipelineExpression(
89-
node,
90-
new DocumentExpression(itemSerializationInfo.Serializer));
88+
if (itemSerializationInfo.ElementName == null)
89+
{
90+
return new PipelineExpression(
91+
node,
92+
new DocumentExpression(itemSerializationInfo.Serializer));
93+
}
94+
else
95+
{
96+
return new PipelineExpression(
97+
node,
98+
new FieldExpression(itemSerializationInfo.ElementName, itemSerializationInfo.Serializer));
99+
}
91100
}
92101
}
93102
else if (node.NodeType == ExpressionType.Constant)

src/MongoDB.Driver/Linq/Processors/Pipeline/MethodCallBinders/GroupByBinder.cs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -62,13 +62,17 @@ private Expression BindKey(PipelineExpression pipeline, PipelineBindingContext b
6262

6363
private Expression BuildProjector(PipelineBindingContext bindingContext, Expression idSelector, Expression elementSelector)
6464
{
65+
var elementSerializer = bindingContext.GetSerializer(elementSelector.Type, elementSelector);
66+
var elementFieldName = (elementSelector as IFieldExpression)?.FieldName;
67+
6568
var serializerType = typeof(GroupingDeserializer<,>).MakeGenericType(
6669
idSelector.Type,
6770
elementSelector.Type);
6871
var serializer = (IBsonSerializer)Activator.CreateInstance(
6972
serializerType,
7073
bindingContext.GetSerializer(idSelector.Type, idSelector),
71-
bindingContext.GetSerializer(elementSelector.Type, elementSelector));
74+
bindingContext.GetSerializer(elementSelector.Type, elementSelector),
75+
elementFieldName);
7276

7377
return new DocumentExpression(serializer);
7478
}
@@ -100,13 +104,15 @@ System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
100104

101105
private class GroupingDeserializer<TKey, TElement> : SerializerBase<IGrouping<TKey, TElement>>, IBsonDocumentSerializer, IBsonArraySerializer
102106
{
107+
private readonly string _elementFieldName;
103108
private readonly IBsonSerializer _elementSerializer;
104109
private readonly IBsonSerializer _idSerializer;
105110

106-
public GroupingDeserializer(IBsonSerializer idSerializer, IBsonSerializer elementSerializer)
111+
public GroupingDeserializer(IBsonSerializer idSerializer, IBsonSerializer elementSerializer, string elementFieldName)
107112
{
108113
_idSerializer = idSerializer;
109114
_elementSerializer = elementSerializer;
115+
_elementFieldName = elementFieldName;
110116
}
111117

112118
public override IGrouping<TKey, TElement> Deserialize(BsonDeserializationContext context, BsonDeserializationArgs args)
@@ -144,7 +150,7 @@ public bool TryGetMemberSerializationInfo(string memberName, out BsonSerializati
144150

145151
public bool TryGetItemSerializationInfo(out BsonSerializationInfo serializationInfo)
146152
{
147-
serializationInfo = new BsonSerializationInfo(null, _elementSerializer, typeof(TElement));
153+
serializationInfo = new BsonSerializationInfo(_elementFieldName, _elementSerializer, typeof(TElement));
148154
return true;
149155
}
150156
}

0 commit comments

Comments
 (0)