diff --git a/src/NHibernate.Test/Async/NHSpecificTest/GH2549/Fixture.cs b/src/NHibernate.Test/Async/NHSpecificTest/GH2549/Fixture.cs
index 82227867203..63ef36ffe09 100644
--- a/src/NHibernate.Test/Async/NHSpecificTest/GH2549/Fixture.cs
+++ b/src/NHibernate.Test/Async/NHSpecificTest/GH2549/Fixture.cs
@@ -15,6 +15,7 @@
namespace NHibernate.Test.NHSpecificTest.GH2549
{
using System.Threading.Tasks;
+ // Test GH3046 too, when useManyToOne is true.
[TestFixture]
public class FixtureAsync : BugTestCase
{
@@ -41,8 +42,8 @@ protected override void OnTearDown()
}
}
- [Test]
- public async Task EntityJoinFilterLinqAsync()
+ [Theory]
+ public async Task EntityJoinFilterLinqAsync(bool useManyToOne)
{
using (var s = OpenSession())
{
@@ -50,7 +51,7 @@ public async Task EntityJoinFilterLinqAsync()
join c in s.Query() on p.Name equals c.Name
select p).ToListAsync());
- s.EnableFilter("DeletedCustomer").SetParameter("deleted", false);
+ s.EnableFilter(useManyToOne ? "DeletedCustomer" : "DeletedCustomerNoManyToOne").SetParameter("deleted", false);
var filteredList = await ((from p in s.Query()
join c in s.Query() on p.Name equals c.Name
@@ -61,8 +62,8 @@ join c in s.Query() on p.Name equals c.Name
}
}
- [Test]
- public async Task EntityJoinFilterQueryOverAsync()
+ [Theory]
+ public async Task EntityJoinFilterQueryOverAsync(bool useManyToOne)
{
using (var s = OpenSession())
{
@@ -70,7 +71,7 @@ public async Task EntityJoinFilterQueryOverAsync()
Person p = null;
var list = await (s.QueryOver(() => p).JoinEntityAlias(() => c, () => c.Name == p.Name).ListAsync());
- s.EnableFilter("DeletedCustomer").SetParameter("deleted", false);
+ s.EnableFilter(useManyToOne ? "DeletedCustomer" : "DeletedCustomerNoManyToOne").SetParameter("deleted", false);
var filteredList = await (s.QueryOver(() => p).JoinEntityAlias(() => c, () => c.Name == p.Name).ListAsync());
diff --git a/src/NHibernate.Test/NHSpecificTest/GH2549/Fixture.cs b/src/NHibernate.Test/NHSpecificTest/GH2549/Fixture.cs
index a01c1ec2572..8912bec9a25 100644
--- a/src/NHibernate.Test/NHSpecificTest/GH2549/Fixture.cs
+++ b/src/NHibernate.Test/NHSpecificTest/GH2549/Fixture.cs
@@ -3,6 +3,7 @@
namespace NHibernate.Test.NHSpecificTest.GH2549
{
+ // Test GH3046 too, when useManyToOne is true.
[TestFixture]
public class Fixture : BugTestCase
{
@@ -29,8 +30,8 @@ protected override void OnTearDown()
}
}
- [Test]
- public void EntityJoinFilterLinq()
+ [Theory]
+ public void EntityJoinFilterLinq(bool useManyToOne)
{
using (var s = OpenSession())
{
@@ -38,7 +39,7 @@ public void EntityJoinFilterLinq()
join c in s.Query() on p.Name equals c.Name
select p).ToList();
- s.EnableFilter("DeletedCustomer").SetParameter("deleted", false);
+ s.EnableFilter(useManyToOne ? "DeletedCustomer" : "DeletedCustomerNoManyToOne").SetParameter("deleted", false);
var filteredList = (from p in s.Query()
join c in s.Query() on p.Name equals c.Name
@@ -49,8 +50,8 @@ join c in s.Query() on p.Name equals c.Name
}
}
- [Test]
- public void EntityJoinFilterQueryOver()
+ [Theory]
+ public void EntityJoinFilterQueryOver(bool useManyToOne)
{
using (var s = OpenSession())
{
@@ -58,7 +59,7 @@ public void EntityJoinFilterQueryOver()
Person p = null;
var list = s.QueryOver(() => p).JoinEntityAlias(() => c, () => c.Name == p.Name).List();
- s.EnableFilter("DeletedCustomer").SetParameter("deleted", false);
+ s.EnableFilter(useManyToOne ? "DeletedCustomer" : "DeletedCustomerNoManyToOne").SetParameter("deleted", false);
var filteredList = s.QueryOver(() => p).JoinEntityAlias(() => c, () => c.Name == p.Name).List();
diff --git a/src/NHibernate.Test/NHSpecificTest/GH2549/Mappings.hbm.xml b/src/NHibernate.Test/NHSpecificTest/GH2549/Mappings.hbm.xml
index 65b540b9202..de096391e88 100644
--- a/src/NHibernate.Test/NHSpecificTest/GH2549/Mappings.hbm.xml
+++ b/src/NHibernate.Test/NHSpecificTest/GH2549/Mappings.hbm.xml
@@ -10,6 +10,7 @@
+
@@ -23,4 +24,8 @@
+
+
+
+
diff --git a/src/NHibernate/Engine/JoinSequence.cs b/src/NHibernate/Engine/JoinSequence.cs
index e706d97886e..0682cc10df5 100644
--- a/src/NHibernate/Engine/JoinSequence.cs
+++ b/src/NHibernate/Engine/JoinSequence.cs
@@ -175,7 +175,7 @@ internal virtual JoinFragment ToJoinFragment(
{
Join join = joins[i];
string on = join.AssociationType.GetOnCondition(join.Alias, factory, enabledFilters);
- SqlString condition = new SqlString();
+ SqlString condition;
if (last != null &&
IsManyToManyRoot(last) &&
((IQueryableCollection)last).ElementType == join.AssociationType)
@@ -195,10 +195,17 @@ internal virtual JoinFragment ToJoinFragment(
{
// NH Different behavior : NH1179 and NH1293
// Apply filters for entity joins and Many-To-One association
- var enabledForManyToOne = FilterHelper.GetEnabledForManyToOne(enabledFilters);
- condition = new SqlString(string.IsNullOrEmpty(on) && (ForceFilter || enabledForManyToOne.Count > 0)
- ? join.Joinable.FilterFragment(join.Alias, enabledForManyToOne)
- : on);
+ if (string.IsNullOrEmpty(on))
+ {
+ var enabledFiltersForJoin = ForceFilter ? enabledFilters : FilterHelper.GetEnabledForManyToOne(enabledFilters);
+ condition = new SqlString(ForceFilter || enabledFiltersForJoin.Count > 0
+ ? join.Joinable.FilterFragment(join.Alias, enabledFiltersForJoin)
+ : on);
+ }
+ else
+ {
+ condition = new SqlString(on);
+ }
}
if (withClauseFragment != null)
diff --git a/src/NHibernate/Loader/JoinWalker.cs b/src/NHibernate/Loader/JoinWalker.cs
index 1f1ed70fc56..ff02c24306d 100644
--- a/src/NHibernate/Loader/JoinWalker.cs
+++ b/src/NHibernate/Loader/JoinWalker.cs
@@ -853,9 +853,10 @@ protected JoinFragment MergeOuterJoins(IList associati
oj.AddJoins(outerjoin);
// NH Different behavior : NH1179 and NH1293
// Apply filters for entity joins and Many-To-One associations
- if (oj.ForceFilter || enabledFiltersForManyToOne.Count > 0)
+ var enabledFiltersForJoin = oj.ForceFilter ? enabledFilters : enabledFiltersForManyToOne;
+ if (oj.ForceFilter || enabledFiltersForJoin.Count > 0)
{
- string manyToOneFilterFragment = oj.Joinable.FilterFragment(oj.RHSAlias, enabledFiltersForManyToOne);
+ string manyToOneFilterFragment = oj.Joinable.FilterFragment(oj.RHSAlias, enabledFiltersForJoin);
bool joinClauseDoesNotContainsFilterAlready =
outerjoin.ToFromFragmentString.IndexOfCaseInsensitive(manyToOneFilterFragment) == -1;
if (joinClauseDoesNotContainsFilterAlready)