diff --git a/src/NHibernate.Test/Async/NHSpecificTest/GH2614/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/GH2614/Fixture.cs
new file mode 100644
index 00000000000..2b7c0006da0
--- /dev/null
+++ b/src/NHibernate.Test/Async/NHSpecificTest/GH2614/Fixture.cs
@@ -0,0 +1,54 @@
+//------------------------------------------------------------------------------
+//
+// This code was generated by AsyncGenerator.
+//
+// Changes to this file may cause incorrect behavior and will be lost if
+// the code is regenerated.
+//
+//------------------------------------------------------------------------------
+
+
+using NUnit.Framework;
+
+namespace NHibernate.Test.NHSpecificTest.GH2614
+{
+ using System.Threading.Tasks;
+ [TestFixture]
+ public class FixtureAsync : BugTestCase
+ {
+ protected override void OnSetUp()
+ {
+ using (var s = OpenSession())
+ using (var t = s.BeginTransaction())
+ {
+ s.Save(new ConcreteClass1 {Name = "C1"});
+ s.Save(new ConcreteClass2 {Name = "C2"});
+ t.Commit();
+ }
+ }
+
+ protected override void OnTearDown()
+ {
+ using (var s = OpenSession())
+ using (var t = s.BeginTransaction())
+ {
+ s.CreateQuery("delete from System.Object").ExecuteUpdate();
+ t.Commit();
+ }
+ }
+
+ [Test]
+ public async Task PolymorphicListReturnsCorrectResultsAsync()
+ {
+ using (var s = OpenSession())
+ using (s.BeginTransaction())
+ {
+ var query = s.CreateQuery(
+ @"SELECT Name FROM NHibernate.Test.NHSpecificTest.GH2614.BaseClass ROOT");
+ query.SetMaxResults(5);
+ var list = await (query.ListAsync());
+ Assert.That(list.Count, Is.EqualTo(2));
+ }
+ }
+ }
+}
diff --git a/src/NHibernate.Test/NHSpecificTest/GH2614/BaseClass.cs b/src/NHibernate.Test/NHSpecificTest/GH2614/BaseClass.cs
new file mode 100644
index 00000000000..07ae632ad07
--- /dev/null
+++ b/src/NHibernate.Test/NHSpecificTest/GH2614/BaseClass.cs
@@ -0,0 +1,8 @@
+namespace NHibernate.Test.NHSpecificTest.GH2614
+{
+ public abstract class BaseClass
+ {
+ public virtual int Id { get; set; }
+ public virtual string Name { get; set; }
+ }
+}
diff --git a/src/NHibernate.Test/NHSpecificTest/GH2614/ConcreteClass1.cs b/src/NHibernate.Test/NHSpecificTest/GH2614/ConcreteClass1.cs
new file mode 100644
index 00000000000..e164a83a07d
--- /dev/null
+++ b/src/NHibernate.Test/NHSpecificTest/GH2614/ConcreteClass1.cs
@@ -0,0 +1,6 @@
+namespace NHibernate.Test.NHSpecificTest.GH2614
+{
+ public class ConcreteClass1 : BaseClass
+ {
+ }
+}
diff --git a/src/NHibernate.Test/NHSpecificTest/GH2614/ConcreteClass2.cs b/src/NHibernate.Test/NHSpecificTest/GH2614/ConcreteClass2.cs
new file mode 100644
index 00000000000..0c5f9f20eb7
--- /dev/null
+++ b/src/NHibernate.Test/NHSpecificTest/GH2614/ConcreteClass2.cs
@@ -0,0 +1,8 @@
+using System.Collections.Generic;
+
+namespace NHibernate.Test.NHSpecificTest.GH2614
+{
+ public class ConcreteClass2 : BaseClass
+ {
+ }
+}
diff --git a/src/NHibernate.Test/NHSpecificTest/GH2614/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/GH2614/Fixture.cs
new file mode 100644
index 00000000000..82876011bae
--- /dev/null
+++ b/src/NHibernate.Test/NHSpecificTest/GH2614/Fixture.cs
@@ -0,0 +1,43 @@
+using NUnit.Framework;
+
+namespace NHibernate.Test.NHSpecificTest.GH2614
+{
+ [TestFixture]
+ public class Fixture : BugTestCase
+ {
+ protected override void OnSetUp()
+ {
+ using (var s = OpenSession())
+ using (var t = s.BeginTransaction())
+ {
+ s.Save(new ConcreteClass1 {Name = "C1"});
+ s.Save(new ConcreteClass2 {Name = "C2"});
+ t.Commit();
+ }
+ }
+
+ protected override void OnTearDown()
+ {
+ using (var s = OpenSession())
+ using (var t = s.BeginTransaction())
+ {
+ s.CreateQuery("delete from System.Object").ExecuteUpdate();
+ t.Commit();
+ }
+ }
+
+ [Test]
+ public void PolymorphicListReturnsCorrectResults()
+ {
+ using (var s = OpenSession())
+ using (s.BeginTransaction())
+ {
+ var query = s.CreateQuery(
+ @"SELECT Name FROM NHibernate.Test.NHSpecificTest.GH2614.BaseClass ROOT");
+ query.SetMaxResults(5);
+ var list = query.List();
+ Assert.That(list.Count, Is.EqualTo(2));
+ }
+ }
+ }
+}
diff --git a/src/NHibernate.Test/NHSpecificTest/GH2614/Mappings.hbm.xml b/src/NHibernate.Test/NHSpecificTest/GH2614/Mappings.hbm.xml
new file mode 100644
index 00000000000..3aaefa26341
--- /dev/null
+++ b/src/NHibernate.Test/NHSpecificTest/GH2614/Mappings.hbm.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/NHibernate/Async/Engine/Query/HQLQueryPlan.cs b/src/NHibernate/Async/Engine/Query/HQLQueryPlan.cs
index f0e5674ea69..a5ced8d10d7 100644
--- a/src/NHibernate/Async/Engine/Query/HQLQueryPlan.cs
+++ b/src/NHibernate/Async/Engine/Query/HQLQueryPlan.cs
@@ -78,7 +78,7 @@ public async Task PerformListAsync(QueryParameters queryParameters, ISessionImpl
for (int x = 0; x < size; x++)
{
object result = tmp[x];
- if (distinction.Add(result))
+ if (!distinction.Add(result))
{
continue;
}
diff --git a/src/NHibernate/Engine/Query/HQLQueryPlan.cs b/src/NHibernate/Engine/Query/HQLQueryPlan.cs
index eb02c296cea..fd6717a3d33 100644
--- a/src/NHibernate/Engine/Query/HQLQueryPlan.cs
+++ b/src/NHibernate/Engine/Query/HQLQueryPlan.cs
@@ -128,7 +128,7 @@ public void PerformList(QueryParameters queryParameters, ISessionImplementor ses
for (int x = 0; x < size; x++)
{
object result = tmp[x];
- if (distinction.Add(result))
+ if (!distinction.Add(result))
{
continue;
}