Skip to content

Commit 0fb5623

Browse files
committed
Fixed Clone for SelectMode
1 parent 8be64d3 commit 0fb5623

File tree

3 files changed

+55
-0
lines changed

3 files changed

+55
-0
lines changed

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

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,33 @@ public async Task SelectModeFetchAsync()
7979
Assert.That(sqlLog.Appender.GetEvents().Length, Is.EqualTo(1), "Only one SQL select is expected");
8080
}
8181
}
82+
83+
//Check that SelecMode survives query cloning
84+
[Test]
85+
public async Task SelectModeFetch_ClonedQueryOverAsync()
86+
{
87+
using (var sqlLog = new SqlLogSpy())
88+
using (var session = OpenSession())
89+
{
90+
var list = await (session.QueryOver<EntityComplex>()
91+
.With(SelectMode.Fetch, ec => ec.Child1)
92+
.JoinQueryOver(ec => ec.ChildrenList, JoinType.InnerJoin)
93+
//now we can fetch inner joined collection
94+
.With(SelectMode.Fetch, childrenList => childrenList)
95+
.TransformUsing(Transformers.DistinctRootEntity)
96+
.Clone()
97+
.ListAsync());
98+
99+
var root = list.FirstOrDefault();
100+
Assert.That(root, Is.Not.Null);
101+
Assert.That(NHibernateUtil.IsInitialized(root), Is.True);
102+
Assert.That(root.Child1, Is.Not.Null);
103+
Assert.That(NHibernateUtil.IsInitialized(root.Child1), Is.True, "Entity must be initialized");
104+
Assert.That(NHibernateUtil.IsInitialized(root.ChildrenList), Is.True, "ChildrenList Inner Joined collection must be initialized");
105+
106+
Assert.That(sqlLog.Appender.GetEvents().Length, Is.EqualTo(1), "Only one SQL select is expected");
107+
}
108+
}
82109

83110
[Test]
84111
public async Task SelectModeDefaultAsync()

src/NHibernate.Test/Criteria/SelectModeTest/SelectModeTest.cs

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,33 @@ public void SelectModeFetch()
6868
Assert.That(sqlLog.Appender.GetEvents().Length, Is.EqualTo(1), "Only one SQL select is expected");
6969
}
7070
}
71+
72+
//Check that SelecMode survives query cloning
73+
[Test]
74+
public void SelectModeFetch_ClonedQueryOver()
75+
{
76+
using (var sqlLog = new SqlLogSpy())
77+
using (var session = OpenSession())
78+
{
79+
var list = session.QueryOver<EntityComplex>()
80+
.With(SelectMode.Fetch, ec => ec.Child1)
81+
.JoinQueryOver(ec => ec.ChildrenList, JoinType.InnerJoin)
82+
//now we can fetch inner joined collection
83+
.With(SelectMode.Fetch, childrenList => childrenList)
84+
.TransformUsing(Transformers.DistinctRootEntity)
85+
.Clone()
86+
.List();
87+
88+
var root = list.FirstOrDefault();
89+
Assert.That(root, Is.Not.Null);
90+
Assert.That(NHibernateUtil.IsInitialized(root), Is.True);
91+
Assert.That(root.Child1, Is.Not.Null);
92+
Assert.That(NHibernateUtil.IsInitialized(root.Child1), Is.True, "Entity must be initialized");
93+
Assert.That(NHibernateUtil.IsInitialized(root.ChildrenList), Is.True, "ChildrenList Inner Joined collection must be initialized");
94+
95+
Assert.That(sqlLog.Appender.GetEvents().Length, Is.EqualTo(1), "Only one SQL select is expected");
96+
}
97+
}
7198

7299
[Test]
73100
public void SelectModeDefault()

src/NHibernate/Impl/CriteriaImpl.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -561,6 +561,7 @@ public object Clone()
561561
{
562562
clone.lockModes.Add(de.Key, de.Value);
563563
}
564+
clone.selectModes.AddOrOverride(selectModes);
564565
clone.maxResults = maxResults;
565566
clone.firstResult = firstResult;
566567
clone.timeout = timeout;

0 commit comments

Comments
 (0)