Skip to content

Commit ee79712

Browse files
committed
CSHARP-506: Better error message when comparing a non-nullable field to a nullable value.
1 parent 74cd796 commit ee79712

File tree

2 files changed

+27
-0
lines changed

2 files changed

+27
-0
lines changed

src/MongoDB.Driver/Linq/Translators/PredicateTranslator.cs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -439,6 +439,21 @@ private FilterDefinition<BsonDocument> TranslateComparison(Expression variableEx
439439
return isTrueComparison ? query : __builder.Not(query);
440440
}
441441

442+
if (variableExpression.NodeType == ExpressionType.Convert)
443+
{
444+
var convertExpression = (UnaryExpression)variableExpression;
445+
var targetTypeInfo = convertExpression.Type.GetTypeInfo();
446+
if (targetTypeInfo.IsGenericType && targetTypeInfo.GetGenericTypeDefinition() == typeof(Nullable<>))
447+
{
448+
var underlyingValueType = targetTypeInfo.GetGenericArguments()[0];
449+
var convertOperand = convertExpression.Operand as FieldExpression;
450+
if (convertOperand != null && convertOperand.Type == underlyingValueType)
451+
{
452+
return null;
453+
}
454+
}
455+
}
456+
442457
var fieldExpression = GetFieldExpression(variableExpression);
443458
var serializedValue = fieldExpression.SerializeValue(value);
444459
switch (operatorType)

tests/MongoDB.Driver.Tests/Linq/Translators/PredicateTranslatorTests.cs

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -615,6 +615,18 @@ public void Equals_with_nullable_date_time()
615615
"{'R': { $ne: null, $gt: ISODate('0001-01-01T00:00:00Z') } }");
616616
}
617617

618+
[Fact]
619+
public void Equals_with_non_nullable_field_and_nullable_value()
620+
{
621+
var value = (int?)null;
622+
Expression<Func<Root, bool>> filter = d => d.Id == value;
623+
var serializer = BsonSerializer.SerializerRegistry.GetSerializer<Root>();
624+
625+
var exception = Record.Exception(() => PredicateTranslator.Translate(filter, serializer, BsonSerializer.SerializerRegistry));
626+
627+
exception.Should().BeOfType<ArgumentException>();
628+
}
629+
618630
[Fact]
619631
public void HashSetCount()
620632
{

0 commit comments

Comments
 (0)