Skip to content

Commit 28a4cb8

Browse files
Merge branch 'master' into NH-2319
2 parents 79f34ed + f3ccc55 commit 28a4cb8

File tree

5 files changed

+53
-21
lines changed

5 files changed

+53
-21
lines changed

src/.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,4 +33,5 @@ _ReSharper*/
3333
SharedAssemblyInfo.*
3434
hibernate.cfg.xml
3535
.vs/
36-
packages/
36+
packages/
37+
.idea/

src/NHibernate.Test/Async/Criteria/ProjectionsTest.cs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -358,6 +358,29 @@ public async Task UseNotEqPropertyWithProjectionAsync()
358358
}
359359
}
360360

361+
[Test]
362+
public async Task UseSumWithNullResultWithProjectionAsync()
363+
{
364+
using (ISession session = Sfi.OpenSession())
365+
{
366+
long sum = await (session.CreateCriteria(typeof(Reptile))
367+
.SetProjection(Projections.Sum(Projections.Id()))
368+
.UniqueResultAsync<long>());
369+
Assert.AreEqual(0, sum);
370+
}
371+
}
361372

373+
[Test]
374+
public async Task UseSubquerySumWithNullResultWithProjectionAsync()
375+
{
376+
using (ISession session = Sfi.OpenSession())
377+
{
378+
int sum = await (session.CreateCriteria(typeof(Enrolment))
379+
.CreateCriteria("Student", "s")
380+
.SetProjection(Projections.Sum(Projections.SqlFunction("length", NHibernateUtil.Int32, Projections.Property("s.Name"))))
381+
.UniqueResultAsync<int>());
382+
Assert.AreEqual(0, sum);
383+
}
384+
}
362385
}
363386
}

src/NHibernate.Test/Criteria/ProjectionsTest.cs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -347,6 +347,29 @@ public void UseNotEqPropertyWithProjection()
347347
}
348348
}
349349

350+
[Test]
351+
public void UseSumWithNullResultWithProjection()
352+
{
353+
using (ISession session = Sfi.OpenSession())
354+
{
355+
long sum = session.CreateCriteria(typeof(Reptile))
356+
.SetProjection(Projections.Sum(Projections.Id()))
357+
.UniqueResult<long>();
358+
Assert.AreEqual(0, sum);
359+
}
360+
}
350361

362+
[Test]
363+
public void UseSubquerySumWithNullResultWithProjection()
364+
{
365+
using (ISession session = Sfi.OpenSession())
366+
{
367+
int sum = session.CreateCriteria(typeof(Enrolment))
368+
.CreateCriteria("Student", "s")
369+
.SetProjection(Projections.Sum(Projections.SqlFunction("length", NHibernateUtil.Int32, Projections.Property("s.Name"))))
370+
.UniqueResult<int>();
371+
Assert.AreEqual(0, sum);
372+
}
373+
}
351374
}
352375
}

src/NHibernate/Async/Impl/CriteriaImpl.cs

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -110,19 +110,13 @@ public sealed partial class Subcriteria : ICriteria
110110
return root.ListAsync<T>(cancellationToken);
111111
}
112112

113-
public async Task<T> UniqueResultAsync<T>(CancellationToken cancellationToken = default(CancellationToken))
113+
public Task<T> UniqueResultAsync<T>(CancellationToken cancellationToken = default(CancellationToken))
114114
{
115-
cancellationToken.ThrowIfCancellationRequested();
116-
object result = await (UniqueResultAsync(cancellationToken)).ConfigureAwait(false);
117-
if (result == null && typeof (T).IsValueType)
118-
{
119-
throw new InvalidCastException(
120-
"UniqueResult<T>() cannot cast null result to value type. Call UniqueResult<T?>() instead");
121-
}
122-
else
115+
if (cancellationToken.IsCancellationRequested)
123116
{
124-
return (T) result;
117+
return Task.FromCanceled<T>(cancellationToken);
125118
}
119+
return root.UniqueResultAsync<T>(cancellationToken);
126120
}
127121

128122
public Task<object> UniqueResultAsync(CancellationToken cancellationToken = default(CancellationToken))

src/NHibernate/Impl/CriteriaImpl.cs

Lines changed: 1 addition & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -808,16 +808,7 @@ public IList<T> List<T>()
808808

809809
public T UniqueResult<T>()
810810
{
811-
object result = UniqueResult();
812-
if (result == null && typeof (T).IsValueType)
813-
{
814-
throw new InvalidCastException(
815-
"UniqueResult<T>() cannot cast null result to value type. Call UniqueResult<T?>() instead");
816-
}
817-
else
818-
{
819-
return (T) result;
820-
}
811+
return root.UniqueResult<T>();
821812
}
822813

823814
public void ClearOrders()

0 commit comments

Comments
 (0)