Skip to content

Commit d9ac8c0

Browse files
committed
CSHARP-1443: fix issue with no matching documents causing count or sum results of 0 to throw an exception.
1 parent d7209e2 commit d9ac8c0

File tree

4 files changed

+60
-5
lines changed

4 files changed

+60
-5
lines changed

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

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,14 @@ public void Count_with_predicate()
123123
result.Should().Be(1);
124124
}
125125

126+
[Test]
127+
public void Count_with_no_matches()
128+
{
129+
var result = CreateQuery().Count(x => x.C.E.F == 13151235);
130+
131+
result.Should().Be(0);
132+
}
133+
126134
[Test]
127135
public async Task CountAsync()
128136
{
@@ -139,6 +147,14 @@ public async Task CountAsync_with_predicate()
139147
result.Should().Be(1);
140148
}
141149

150+
[Test]
151+
public async Task CountAsync_with_no_matches()
152+
{
153+
var result = await CreateQuery().CountAsync(x => x.C.E.F == 123412523);
154+
155+
result.Should().Be(0);
156+
}
157+
142158
[Test]
143159
[RequiresServer(MinimumVersion = "2.6.0")]
144160
public void Distinct_followed_by_where()
@@ -364,6 +380,14 @@ public void LongCount_with_predicate()
364380
result.Should().Be(1);
365381
}
366382

383+
[Test]
384+
public void LongCount_with_no_results()
385+
{
386+
var result = CreateQuery().LongCount(x => x.C.E.F == 123452135);
387+
388+
result.Should().Be(0);
389+
}
390+
367391
[Test]
368392
public async Task LongCountAsync()
369393
{
@@ -380,6 +404,14 @@ public async Task LongCountAsync_with_predicate()
380404
result.Should().Be(1);
381405
}
382406

407+
[Test]
408+
public async Task LongCountAsync_with_no_results()
409+
{
410+
var result = await CreateQuery().LongCountAsync(x => x.C.E.F == 12351235);
411+
412+
result.Should().Be(0);
413+
}
414+
383415
[Test]
384416
public void Max()
385417
{
@@ -922,6 +954,14 @@ public void Sum_with_selector()
922954
result.Should().Be(122);
923955
}
924956

957+
[Test]
958+
public void Sum_with_no_results()
959+
{
960+
var result = CreateQuery().Where(x => x.C.E.F == 12341235).Sum(x => x.C.E.F);
961+
962+
result.Should().Be(0);
963+
}
964+
925965
[Test]
926966
public async Task SumAsync()
927967
{
@@ -938,6 +978,14 @@ public async Task SumAsync_with_selector()
938978
result.Should().Be(122);
939979
}
940980

981+
[Test]
982+
public async Task SumAsync_with_no_results()
983+
{
984+
var result = await CreateQuery().Where(x => x.C.E.F == 21341235).SumAsync(x => x.C.E.F);
985+
986+
result.Should().Be(0);
987+
}
988+
941989
[Test]
942990
public void Take()
943991
{

src/MongoDB.Driver/Linq/Expressions/ResultOperators/CountResultOperator.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,12 +40,12 @@ public override Type Type
4040

4141
public LambdaExpression CreateAggregator(Type sourceType)
4242
{
43-
return ResultTransformerHelper.CreateAggregator("Single", sourceType);
43+
return ResultTransformerHelper.CreateAggregator("SingleOrDefault", sourceType);
4444
}
4545

4646
public LambdaExpression CreateAsyncAggregator(Type sourceType)
4747
{
48-
return ResultTransformerHelper.CreateAsyncAggregator("SingleAsync", sourceType);
48+
return ResultTransformerHelper.CreateAsyncAggregator("SingleOrDefaultAsync", sourceType);
4949
}
5050
}
5151
}

src/MongoDB.Driver/Linq/Expressions/ResultOperators/SumResultOperator.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,12 +40,12 @@ public override Type Type
4040

4141
public LambdaExpression CreateAggregator(Type sourceType)
4242
{
43-
return ResultTransformerHelper.CreateAggregator("Single", sourceType);
43+
return ResultTransformerHelper.CreateAggregator("SingleOrDefault", sourceType);
4444
}
4545

4646
public LambdaExpression CreateAsyncAggregator(Type sourceType)
4747
{
48-
return ResultTransformerHelper.CreateAsyncAggregator("SingleAsync", sourceType);
48+
return ResultTransformerHelper.CreateAsyncAggregator("SingleOrDefaultAsync", sourceType);
4949
}
5050
}
5151
}

src/MongoDB.Driver/Linq/MongoQueryProviderImpl.cs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,14 @@ public object Execute(Expression expression)
7979
Translate(expression));
8080

8181
var lambda = Expression.Lambda(executionPlan);
82-
return lambda.Compile().DynamicInvoke(null);
82+
try
83+
{
84+
return lambda.Compile().DynamicInvoke(null);
85+
}
86+
catch (TargetInvocationException tie)
87+
{
88+
throw tie.InnerException;
89+
}
8390
}
8491

8592
public Task<TResult> ExecuteAsync<TResult>(Expression expression, CancellationToken cancellationToken = default(CancellationToken))

0 commit comments

Comments
 (0)