Skip to content

Commit 0295799

Browse files
committed
CSHARP-4401: Test full support for enums in filters.
1 parent e0cae2a commit 0295799

File tree

3 files changed

+312
-7
lines changed

3 files changed

+312
-7
lines changed

src/MongoDB.Driver/Linq/Linq3Implementation/Translators/ExpressionToFilterTranslators/ToFilterFieldTranslators/ConvertExpressionToFilterFieldTranslator.cs

Lines changed: 25 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -35,14 +35,33 @@ public static AstFilterField Translate(TranslationContext context, UnaryExpressi
3535
var fieldType = fieldSerializer.ValueType;
3636
var targetType = expression.Type;
3737

38-
if (fieldType.IsEnum)
38+
if (fieldType.IsEnumOrNullableEnum(out _, out var underlyingType))
3939
{
40-
var enumType = fieldType;
41-
var enumUnderlyingType = enumType.GetEnumUnderlyingType();
42-
if (targetType == enumUnderlyingType)
40+
if (targetType.IsSameAsOrNullableOf(underlyingType))
4341
{
44-
var enumUnderlyingTypeSerializer = EnumUnderlyingTypeSerializer.Create(fieldSerializer);
45-
return AstFilter.Field(field.Path, enumUnderlyingTypeSerializer);
42+
IBsonSerializer enumSerializer;
43+
if (fieldType.IsNullable())
44+
{
45+
var nullableSerializer = (INullableSerializer)fieldSerializer;
46+
enumSerializer = nullableSerializer.ValueSerializer;
47+
}
48+
else
49+
{
50+
enumSerializer = fieldSerializer;
51+
}
52+
53+
IBsonSerializer targetSerializer;
54+
var enumUnderlyingTypeSerializer = EnumUnderlyingTypeSerializer.Create(enumSerializer);
55+
if (targetType.IsNullable())
56+
{
57+
targetSerializer = NullableSerializer.Create(enumUnderlyingTypeSerializer);
58+
}
59+
else
60+
{
61+
targetSerializer = enumUnderlyingTypeSerializer;
62+
}
63+
64+
return AstFilter.Field(field.Path, targetSerializer);
4665
}
4766
}
4867

0 commit comments

Comments
 (0)