public void SubselectFetchNamedParam()
		{
			ISession s = OpenSession();
			ITransaction t = s.BeginTransaction();
			Parent p = new Parent("foo");
			p.Children.Add(new Child("foo1"));
			p.Children.Add(new Child("foo2"));
			Parent q = new Parent("bar");
			q.Children.Add(new Child("bar1"));
			q.Children.Add(new Child("bar2"));
			ArrayHelper.AddAll(q.MoreChildren, p.Children);
			s.Save(p);
			s.Save(q);
			t.Commit();
			s.Close();

			s = OpenSession();
			t = s.BeginTransaction();

			sessions.Statistics.Clear();

			IList parents = s.CreateQuery("from Parent where name between :bar and :foo order by name desc")
				.SetParameter("bar", "bar")
				.SetParameter("foo", "foo")
				.List();
			p = (Parent) parents[0];
			q = (Parent) parents[1];

			Assert.IsFalse(NHibernateUtil.IsInitialized(p.Children));
			Assert.IsFalse(NHibernateUtil.IsInitialized(q.Children));

			Assert.AreEqual(p.Children.Count, 2);

			Assert.IsTrue(NHibernateUtil.IsInitialized(p.Children[0]));

			Assert.IsTrue(NHibernateUtil.IsInitialized(q.Children));

			Assert.AreEqual(q.Children.Count, 2);

			Assert.IsTrue(NHibernateUtil.IsInitialized(q.Children[0]));

			Assert.IsFalse(NHibernateUtil.IsInitialized(p.MoreChildren));
			Assert.IsFalse(NHibernateUtil.IsInitialized(q.MoreChildren));

			Assert.AreEqual(p.MoreChildren.Count, 0);

			Assert.IsTrue(NHibernateUtil.IsInitialized(q.MoreChildren));

			Assert.AreEqual(q.MoreChildren.Count, 2);

			Assert.IsTrue(NHibernateUtil.IsInitialized(q.MoreChildren[0]));

			Assert.AreEqual(3, sessions.Statistics.PrepareStatementCount);

			Child c = (Child) p.Children[0];
			NHibernateUtil.Initialize(c.Friends);

			s.Delete(p);
			s.Delete(q);

			t.Commit();
			s.Close();
		}
		public void ManyToManyCriteriaJoin()
		{
			ISession s = OpenSession();
			ITransaction t = s.BeginTransaction();
			Parent p = new Parent("foo");
			p.Children.Add(new Child("foo1"));
			p.Children.Add(new Child("foo2"));
			Parent q = new Parent("bar");
			q.Children.Add(new Child("bar1"));
			q.Children.Add(new Child("bar2"));
			ArrayHelper.AddAll(q.MoreChildren, p.Children);
			s.Save(p);
			s.Save(q);
			t.Commit();
			s.Close();

			s = OpenSession();
			t = s.BeginTransaction();

			s.CreateCriteria(typeof(Parent))
				.AddOrder(Order.Desc("Name"))
				// H3 has this after CreateCriteria("Friends"), but it's not yet supported in NH
				.CreateCriteria("MoreChildren")
				.CreateCriteria("Friends")
				.List();

			IList parents = s.CreateCriteria(typeof(Parent))
				.SetFetchMode("MoreChildren", FetchMode.Join)
				.SetFetchMode("MoreChildren.Friends", FetchMode.Join)
				.AddOrder(Order.Desc("Name"))
				.List();

			s.Delete(parents[0]);
			s.Delete(parents[1]);

			t.Commit();
			s.Close();
		}
		public void SubselectFetchCriteria()
		{
			ISession s = OpenSession();
			ITransaction t = s.BeginTransaction();
			Parent p = new Parent("foo");
			p.Children.Add(new Child("foo1"));
			p.Children.Add(new Child("foo2"));
			Parent q = new Parent("bar");
			q.Children.Add(new Child("bar1"));
			q.Children.Add(new Child("bar2"));
			ArrayHelper.AddAll(q.MoreChildren, p.Children);
			s.Save(p);
			s.Save(q);
			t.Commit();
			s.Close();

			s = OpenSession();
			t = s.BeginTransaction();

			sessions.Statistics.Clear();

			IList parents = s.CreateCriteria(typeof(Parent))
				.Add(Expression.Between("Name", "bar", "foo"))
				.AddOrder(Order.Desc("Name"))
				.List();
			p = (Parent) parents[0];
			q = (Parent) parents[1];

			Assert.IsFalse(NHibernateUtil.IsInitialized(p.Children));
			Assert.IsFalse(NHibernateUtil.IsInitialized(q.Children));

			Assert.AreEqual(p.Children.Count, 2);

			Assert.IsTrue(NHibernateUtil.IsInitialized(p.Children[0]));

			Assert.IsTrue(NHibernateUtil.IsInitialized(q.Children));

			Assert.AreEqual(q.Children.Count, 2);

			Assert.IsTrue(NHibernateUtil.IsInitialized(q.Children[0]));

			Assert.IsFalse(NHibernateUtil.IsInitialized(p.MoreChildren));
			Assert.IsFalse(NHibernateUtil.IsInitialized(q.MoreChildren));

			Assert.AreEqual(p.MoreChildren.Count, 0);

			Assert.IsTrue(NHibernateUtil.IsInitialized(q.MoreChildren));

			Assert.AreEqual(q.MoreChildren.Count, 2);

			Assert.IsTrue(NHibernateUtil.IsInitialized(q.MoreChildren[0]));

			Assert.AreEqual(3, sessions.Statistics.PrepareStatementCount);

			Child c = (Child) p.Children[0];
			NHibernateUtil.Initialize(c.Friends);

			s.Delete(p);
			s.Delete(q);

			t.Commit();
			s.Close();
		}
		public void SubselectFetchWithLimit()
		{
			ISession s = OpenSession();
			ITransaction t = s.BeginTransaction();
			Parent p = new Parent("foo");
			p.Children.Add(new Child("foo1"));
			p.Children.Add(new Child("foo2"));
			Parent q = new Parent("bar");
			q.Children.Add(new Child("bar1"));
			q.Children.Add(new Child("bar2"));
			Parent r = new Parent("aaa");
			r.Children.Add(new Child("aaa1"));
			s.Save(p);
			s.Save(q);
			s.Save(r);
			t.Commit();
			s.Close();

			s = OpenSession();
			t = s.BeginTransaction();

			sessions.Statistics.Clear();

			IList parents = s.CreateQuery("from Parent order by name desc")
				.SetMaxResults(2)
				.List();
			p = (Parent) parents[0];
			q = (Parent) parents[1];
			Assert.IsFalse(NHibernateUtil.IsInitialized(p.Children));
			Assert.IsFalse(NHibernateUtil.IsInitialized(p.MoreChildren));
			Assert.IsFalse(NHibernateUtil.IsInitialized(q.Children));
			Assert.IsFalse(NHibernateUtil.IsInitialized(q.MoreChildren));
			Assert.AreEqual(p.MoreChildren.Count, 0);
			Assert.AreEqual(p.Children.Count, 2);
			Assert.IsTrue(NHibernateUtil.IsInitialized(q.Children));
			Assert.IsTrue(NHibernateUtil.IsInitialized(q.MoreChildren));

			Assert.AreEqual(3, sessions.Statistics.PrepareStatementCount);

			r = (Parent) s.Get(typeof(Parent), r.Name);
			Assert.IsTrue(NHibernateUtil.IsInitialized(r.Children)); // The test for True is the test of H3.2
			Assert.IsFalse(NHibernateUtil.IsInitialized(r.MoreChildren));
			Assert.AreEqual(r.Children.Count, 1);
			Assert.AreEqual(r.MoreChildren.Count, 0);

			s.Delete(p);
			s.Delete(q);
			s.Delete(r);

			t.Commit();
			s.Close();
		}