Skip to content

Commit 8c5d847

Browse files
committed
CSHARP-1470: propogate embedded array field prefixes correctly.
1 parent 5129fc9 commit 8c5d847

File tree

5 files changed

+47
-8
lines changed

5 files changed

+47
-8
lines changed

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

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

1039+
[Test]
1040+
public void SelectMany_followed_by_a_group()
1041+
{
1042+
var first = from x in CreateQuery()
1043+
from y in x.G
1044+
select y;
1045+
1046+
var query = from f in first
1047+
group f by f.D into g
1048+
select new
1049+
{
1050+
g.Key,
1051+
SumF = g.Sum(x => x.E.F)
1052+
};
1053+
1054+
Assert(query,
1055+
4,
1056+
"{ $unwind: '$G' }",
1057+
"{ $project: { G: '$G', _id: 0 } }",
1058+
"{ $group: { _id: '$G.D', __agg0: { $sum : '$G.E.F' } } }",
1059+
"{ $project: { Key: '$_id', SumF: '$__agg0', _id: 0 } }");
1060+
}
1061+
10391062
[Test]
10401063
public void Single()
10411064
{

src/MongoDB.Driver/Linq/Translators/FieldExpressionFlattener.cs renamed to src/MongoDB.Driver/Linq/FieldExpressionFlattener.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
using System.Linq.Expressions;
1919
using MongoDB.Driver.Linq.Expressions;
2020

21-
namespace MongoDB.Driver.Linq.Translators
21+
namespace MongoDB.Driver.Linq
2222
{
2323
internal class FieldExpressionFlattener : ExtensionExpressionVisitor
2424
{

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

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -90,9 +90,18 @@ protected override Expression BindNonMethodCall(Expression node)
9090
BsonSerializationInfo itemSerializationInfo;
9191
if (arraySerializer != null && arraySerializer.TryGetItemSerializationInfo(out itemSerializationInfo))
9292
{
93-
return new PipelineExpression(
94-
node,
95-
new DocumentExpression(itemSerializationInfo.Serializer));
93+
if (itemSerializationInfo.ElementName == null)
94+
{
95+
return new PipelineExpression(
96+
node,
97+
new DocumentExpression(itemSerializationInfo.Serializer));
98+
}
99+
else
100+
{
101+
return new PipelineExpression(
102+
node,
103+
new FieldExpression(itemSerializationInfo.ElementName, itemSerializationInfo.Serializer));
104+
}
96105
}
97106
}
98107
else if (node.NodeType == ExpressionType.Constant)

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

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

6363
private DocumentExpression BuildProjector(PipelineBindingContext bindingContext, Expression idSelector, Expression elementSelector)
6464
{
65+
var elementSerializer = bindingContext.GetSerializer(elementSelector.Type, elementSelector);
66+
var flattenedElementField = FieldExpressionFlattener.FlattenFields(elementSelector);
67+
var elementFieldName = (flattenedElementField as IFieldExpression)?.FieldName;
68+
6569
var serializerType = typeof(GroupingDeserializer<,>).MakeGenericType(
6670
idSelector.Type,
6771
elementSelector.Type);
6872
var serializer = (IBsonSerializer)Activator.CreateInstance(
6973
serializerType,
7074
bindingContext.GetSerializer(idSelector.Type, idSelector),
71-
bindingContext.GetSerializer(elementSelector.Type, elementSelector));
75+
bindingContext.GetSerializer(elementSelector.Type, elementSelector),
76+
elementFieldName);
7277

7378
return new DocumentExpression(serializer);
7479
}
@@ -100,13 +105,15 @@ System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
100105

101106
private class GroupingDeserializer<TKey, TElement> : SerializerBase<IGrouping<TKey, TElement>>, IBsonDocumentSerializer, IBsonArraySerializer
102107
{
108+
private readonly string _elementFieldName;
103109
private readonly IBsonSerializer _elementSerializer;
104110
private readonly IBsonSerializer _idSerializer;
105111

106-
public GroupingDeserializer(IBsonSerializer idSerializer, IBsonSerializer elementSerializer)
112+
public GroupingDeserializer(IBsonSerializer idSerializer, IBsonSerializer elementSerializer, string elementFieldName)
107113
{
108114
_idSerializer = idSerializer;
109115
_elementSerializer = elementSerializer;
116+
_elementFieldName = elementFieldName;
110117
}
111118

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

145152
public bool TryGetItemSerializationInfo(out BsonSerializationInfo serializationInfo)
146153
{
147-
serializationInfo = new BsonSerializationInfo(null, _elementSerializer, typeof(TElement));
154+
serializationInfo = new BsonSerializationInfo(_elementFieldName, _elementSerializer, typeof(TElement));
148155
return true;
149156
}
150157
}

src/MongoDB.Driver/MongoDB.Driver.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -234,7 +234,7 @@
234234
<Compile Include="Linq\Translators\AggregateGroupTranslator.cs" />
235235
<Compile Include="Linq\Translators\AggregateLanguageTranslator.cs" />
236236
<Compile Include="Linq\Translators\AggregateProjectTranslator.cs" />
237-
<Compile Include="Linq\Translators\FieldExpressionFlattener.cs" />
237+
<Compile Include="Linq\FieldExpressionFlattener.cs" />
238238
<Compile Include="Linq\Translators\FieldNamePrefixer.cs" />
239239
<Compile Include="Linq\QueryableTranslation.cs" />
240240
<Compile Include="Linq\Translators\FindProjectionTranslator.cs" />

0 commit comments

Comments
 (0)