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)