Skip to content

Commit ccff07b

Browse files
sanych-sunadelinowona
authored andcommitted
CSHARP-5588: Unable to select KeyValuePair Key when using camelCase convention (#1724)
1 parent d6840c3 commit ccff07b

File tree

2 files changed

+17
-10
lines changed

2 files changed

+17
-10
lines changed

src/MongoDB.Driver/Linq/Linq3Implementation/Translators/ExpressionToAggregationExpressionTranslators/NewKeyValuePairExpressionToAggregationExpressionTranslator.cs

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -43,24 +43,32 @@ public static TranslatedExpression Translate(
4343
var keyTranslation = ExpressionToAggregationExpressionTranslator.Translate(context, keyExpression);
4444
var valueTranslation = ExpressionToAggregationExpressionTranslator.Translate(context, valueExpression);
4545

46+
var serializer = CreateResultSerializer(expression.Type, keyTranslation.Serializer, valueTranslation.Serializer, out var keyElementName, out var valueElementName);
4647
var ast = AstExpression.ComputedDocument([
47-
AstExpression.ComputedField("Key", keyTranslation.Ast),
48-
AstExpression.ComputedField("Value", valueTranslation.Ast)
48+
AstExpression.ComputedField(keyElementName, keyTranslation.Ast),
49+
AstExpression.ComputedField(valueElementName, valueTranslation.Ast)
4950
]);
5051

51-
var serializer = CreateResultSerializer(expression.Type, keyTranslation.Serializer, valueTranslation.Serializer);
52-
5352
return new TranslatedExpression(expression, ast, serializer);
5453
}
5554

56-
private static IBsonSerializer CreateResultSerializer(Type resultType, IBsonSerializer keySerializer, IBsonSerializer valueSerializer)
55+
private static IBsonSerializer CreateResultSerializer(
56+
Type resultType,
57+
IBsonSerializer keySerializer,
58+
IBsonSerializer valueSerializer,
59+
out string keyElementName,
60+
out string valueElementName)
5761
{
5862
var constructorInfo = resultType.GetConstructor([keySerializer.ValueType, valueSerializer.ValueType]);
5963
var classMap = new BsonClassMap(resultType);
6064
classMap.MapConstructor(constructorInfo);
6165
classMap.AutoMap();
62-
classMap.GetMemberMap("Key").SetSerializer(keySerializer);
63-
classMap.GetMemberMap("Value").SetSerializer(valueSerializer);
66+
var keyMemberMap = classMap.GetMemberMap("Key");
67+
keyElementName = keyMemberMap.ElementName;
68+
keyMemberMap.SetSerializer(keySerializer);
69+
var valueMemberMap = classMap.GetMemberMap("Value");
70+
valueElementName = valueMemberMap.ElementName;
71+
valueMemberMap.SetSerializer(valueSerializer);
6472
classMap.Freeze();
6573

6674
// have to use BsonClassMapSerializer here to mimic the MemberInitExpressionToAggregationExpressionTranslator to avoid risking a behavioral breaking change

tests/MongoDB.Driver.Tests/Linq/Linq3Implementation/Translators/ExpressionToAggregationExpressionTranslators/NewKeyValuePairExpressionToAggregationExpressionTranslatorTests.cs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121

2222
namespace MongoDB.Driver.Tests.Linq.Linq3Implementation.Translators.ExpressionToAggregationExpressionTranslators;
2323

24-
#if NET6_0_OR_GREATER || NETCOREAPP3_1_OR_GREATER
2524
public class NewKeyValuePairExpressionToAggregationExpressionTranslatorTests : LinqIntegrationTest<NewKeyValuePairExpressionToAggregationExpressionTranslatorTests.ClassFixture>
2625
{
2726
public NewKeyValuePairExpressionToAggregationExpressionTranslatorTests(ClassFixture fixture)
@@ -45,6 +44,7 @@ public void NewKeyValuePair_should_translate()
4544
result.Value.Should().Be(42);
4645
}
4746

47+
#if NET6_0_OR_GREATER || NETCOREAPP3_1_OR_GREATER
4848
[Fact]
4949
public void KeyValuePair_Create_should_translate()
5050
{
@@ -60,6 +60,7 @@ public void KeyValuePair_Create_should_translate()
6060
result.Key.Should().Be("X");
6161
result.Value.Should().Be(42);
6262
}
63+
#endif
6364

6465
public class C
6566
{
@@ -74,5 +75,3 @@ public sealed class ClassFixture : MongoCollectionFixture<C>
7475
];
7576
}
7677
}
77-
78-
#endif

0 commit comments

Comments
 (0)