PageRenderTime 54ms CodeModel.GetById 25ms RepoModel.GetById 0ms app.codeStats 1ms

/src/NHibernate.Test/Criteria/Lambda/IntegrationFixture.cs

https://github.com/okb/nhibernate-core
C# | 844 lines | 706 code | 138 blank | 0 comment | 28 complexity | d529764246ef790b734db5ff13a78786 MD5 | raw file
Possible License(s): GPL-2.0, BSD-3-Clause, LGPL-2.1, MPL-2.0-no-copyleft-exception, LGPL-3.0, Apache-2.0, CC-BY-SA-3.0
  1. using System;
  2. using System.Collections;
  3. using System.Collections.Generic;
  4. using System.Linq;
  5. using NUnit.Framework;
  6. using SharpTestsEx;
  7. using NHibernate.Criterion;
  8. using NHibernate.Transform;
  9. using NHibernate.Type;
  10. using NHibernate.Util;
  11. namespace NHibernate.Test.Criteria.Lambda
  12. {
  13. [TestFixture]
  14. public class IntegrationFixture : TestCase
  15. {
  16. protected override string MappingsAssembly { get { return "NHibernate.Test"; } }
  17. protected override IList Mappings
  18. {
  19. get
  20. {
  21. return new string[]
  22. {
  23. "Criteria.Lambda.Mappings.hbm.xml",
  24. };
  25. }
  26. }
  27. protected override void OnTearDown()
  28. {
  29. base.OnTearDown();
  30. using (ISession s = OpenSession())
  31. using (ITransaction t = s.BeginTransaction())
  32. {
  33. s.CreateQuery("delete from Child").ExecuteUpdate();
  34. s.CreateQuery("update Person p set p.Father = null").ExecuteUpdate();
  35. s.CreateQuery("delete from Person").ExecuteUpdate();
  36. s.CreateQuery("delete from JoinedChild").ExecuteUpdate();
  37. s.CreateQuery("delete from Parent").ExecuteUpdate();
  38. t.Commit();
  39. }
  40. }
  41. [Test]
  42. public void ICriteriaOfT_SimpleCriterion()
  43. {
  44. using (ISession s = OpenSession())
  45. using (ITransaction t = s.BeginTransaction())
  46. {
  47. s.Save(new Person() { Name = "test person 1", Age = 20 });
  48. s.Save(new Person() { Name = "test person 2", Age = 30 });
  49. s.Save(new Person() { Name = "test person 3", Age = 40 });
  50. t.Commit();
  51. }
  52. using (ISession s = OpenSession())
  53. {
  54. IList<Person> actual =
  55. s.QueryOver<Person>()
  56. .Where(p => p.Name == "test person 2")
  57. .And(p => p.Age == 30)
  58. .List();
  59. Assert.That(actual.Count, Is.EqualTo(1));
  60. }
  61. using (ISession s = OpenSession())
  62. {
  63. Person personAlias = null;
  64. IList<Person> actual =
  65. s.QueryOver<Person>(() => personAlias)
  66. .Where(() => personAlias.Name == "test person 2")
  67. .And(() => personAlias.Age == 30)
  68. .List();
  69. Assert.That(actual.Count, Is.EqualTo(1));
  70. }
  71. }
  72. [Test]
  73. public void DetachedQuery_SimpleCriterion()
  74. {
  75. using (ISession s = OpenSession())
  76. using (ITransaction t = s.BeginTransaction())
  77. {
  78. s.Save(new Person() { Name = "test person 1", Age = 20 });
  79. t.Commit();
  80. }
  81. using (ISession s = OpenSession())
  82. {
  83. QueryOver<Person> personQuery =
  84. QueryOver.Of<Person>()
  85. .Where(p => p.Name == "test person 1");
  86. IList<Person> actual =
  87. personQuery.GetExecutableQueryOver(s)
  88. .List();
  89. Assert.That(actual[0].Age, Is.EqualTo(20));
  90. }
  91. }
  92. [Test]
  93. public void Project_SingleProperty()
  94. {
  95. using (ISession s = OpenSession())
  96. using (ITransaction t = s.BeginTransaction())
  97. {
  98. s.Save(new Person() { Name = "test person 1", Age = 20 });
  99. s.Save(new Person() { Name = "test person 2", Age = 30 });
  100. t.Commit();
  101. }
  102. using (ISession s = OpenSession())
  103. {
  104. var actual =
  105. s.QueryOver<Person>()
  106. .Select(p => p.Age)
  107. .OrderBy(p => p.Age).Asc
  108. .List<int>();
  109. Assert.That(actual[0], Is.EqualTo(20));
  110. }
  111. }
  112. [Test]
  113. public void Project_MultipleProperties()
  114. {
  115. using (ISession s = OpenSession())
  116. using (ITransaction t = s.BeginTransaction())
  117. {
  118. s.Save(new Person() { Name = "test person 1", Age = 20 });
  119. s.Save(new Person() { Name = "test person 2", Age = 30 });
  120. t.Commit();
  121. }
  122. using (ISession s = OpenSession())
  123. {
  124. Person personAlias = null;
  125. var actual =
  126. s.QueryOver<Person>(() => personAlias)
  127. .Select(p => p.Name,
  128. p => personAlias.Age)
  129. .OrderBy(p => p.Age).Asc
  130. .List<object[]>()
  131. .Select(props => new {
  132. TestName = (string)props[0],
  133. TestAge = (int)props[1],
  134. });
  135. Assert.That(actual.ElementAt(0).TestName, Is.EqualTo("test person 1"));
  136. Assert.That(actual.ElementAt(1).TestAge, Is.EqualTo(30));
  137. }
  138. }
  139. [Test]
  140. public void Project_TransformToDto()
  141. {
  142. using (ISession s = OpenSession())
  143. using (ITransaction t = s.BeginTransaction())
  144. {
  145. s.Save(new Person() { Name = "test person 1", Age = 20 });
  146. s.Save(new Person() { Name = "test person 1", Age = 30 });
  147. s.Save(new Person() { Name = "test person 2", Age = 40 });
  148. t.Commit();
  149. }
  150. using (ISession s = OpenSession())
  151. {
  152. PersonSummary summary = null;
  153. var actual =
  154. s.QueryOver<Person>()
  155. .SelectList(list => list
  156. .SelectGroup(p => p.Name).WithAlias(() => summary.Name)
  157. .Select(Projections.RowCount()).WithAlias(() => summary.Count))
  158. .OrderByAlias(() => summary.Name).Asc
  159. .TransformUsing(Transformers.AliasToBean<PersonSummary>())
  160. .List<PersonSummary>();
  161. Assert.That(actual.Count, Is.EqualTo(2));
  162. Assert.That(actual[0].Name, Is.EqualTo("test person 1"));
  163. Assert.That(actual[0].Count, Is.EqualTo(2));
  164. Assert.That(actual[1].Name, Is.EqualTo("test person 2"));
  165. Assert.That(actual[1].Count, Is.EqualTo(1));
  166. }
  167. }
  168. [Test]
  169. public void FilterNullComponent()
  170. {
  171. using (ISession s = OpenSession())
  172. using (ITransaction t = s.BeginTransaction())
  173. {
  174. var p1 = new Person() { Detail = new PersonDetail() { MaidenName = "test", Anniversary = new DateTime(2007, 06, 05) } };
  175. var p2 = new Person() { Detail = null };
  176. s.Save(p1);
  177. s.Save(p2);
  178. var nullDetails =
  179. s.QueryOver<Person>()
  180. .Where(p => p.Detail == null)
  181. .List();
  182. Assert.That(nullDetails.Count, Is.EqualTo(1));
  183. Assert.That(nullDetails[0].Id, Is.EqualTo(p2.Id));
  184. }
  185. }
  186. [Test]
  187. public void OnClause()
  188. {
  189. using (ISession s = OpenSession())
  190. using (ITransaction t = s.BeginTransaction())
  191. {
  192. s.Save(new Person() { Name = "John" }
  193. .AddChild(new Child() { Nickname = "John"})
  194. .AddChild(new Child() { Nickname = "Judy"}));
  195. s.Save(new Person() { Name = "Jean" });
  196. s.Save(new Child() { Nickname = "James" });
  197. t.Commit();
  198. }
  199. using (ISession s = OpenSession())
  200. {
  201. Child childAlias = null;
  202. Person parentAlias = null;
  203. var children =
  204. s.QueryOver(() => childAlias)
  205. .Left.JoinQueryOver(c => c.Parent, () => parentAlias, p => p.Name == childAlias.Nickname)
  206. .WhereRestrictionOn(p => p.Name).IsNotNull
  207. .List();
  208. children.Should().Have.Count.EqualTo(1);
  209. }
  210. using (ISession s = OpenSession())
  211. {
  212. Child childAlias = null;
  213. Person parentAlias = null;
  214. var parentNames =
  215. s.QueryOver<Child>(() => childAlias)
  216. .Left.JoinAlias(c => c.Parent, () => parentAlias, p => p.Name == childAlias.Nickname)
  217. .Select(c => parentAlias.Name)
  218. .List<string>();
  219. parentNames
  220. .Where(n => !string.IsNullOrEmpty(n))
  221. .Should().Have.Count.EqualTo(1);
  222. }
  223. using (ISession s = OpenSession())
  224. {
  225. Person personAlias = null;
  226. Child childAlias = null;
  227. var people =
  228. s.QueryOver<Person>(() => personAlias)
  229. .Left.JoinQueryOver(p => p.Children, () => childAlias, c => c.Nickname == personAlias.Name)
  230. .WhereRestrictionOn(c => c.Nickname).IsNotNull
  231. .List();
  232. people.Should().Have.Count.EqualTo(1);
  233. }
  234. using (ISession s = OpenSession())
  235. {
  236. Person personAlias = null;
  237. Child childAlias = null;
  238. var childNames =
  239. s.QueryOver<Person>(() => personAlias)
  240. .Left.JoinAlias(p => p.Children, () => childAlias, c => c.Nickname == personAlias.Name)
  241. .Select(p => childAlias.Nickname)
  242. .List<string>();
  243. childNames
  244. .Where(n => !string.IsNullOrEmpty(n))
  245. .Should().Have.Count.EqualTo(1);
  246. }
  247. }
  248. [Test]
  249. public void UniqueResult()
  250. {
  251. using (ISession s = OpenSession())
  252. using (ITransaction t = s.BeginTransaction())
  253. {
  254. s.Save(new Person() { Name = "test person 1", Age = 20 });
  255. t.Commit();
  256. }
  257. using (ISession s = OpenSession())
  258. {
  259. Person actual =
  260. s.QueryOver<Person>()
  261. .SingleOrDefault();
  262. Assert.That(actual.Name, Is.EqualTo("test person 1"));
  263. }
  264. using (ISession s = OpenSession())
  265. {
  266. string actual =
  267. s.QueryOver<Person>()
  268. .Select(p => p.Name)
  269. .SingleOrDefault<string>();
  270. Assert.That(actual, Is.EqualTo("test person 1"));
  271. }
  272. }
  273. [Test]
  274. public void IsType()
  275. {
  276. using (ISession s = OpenSession())
  277. using (ITransaction t = s.BeginTransaction())
  278. {
  279. var father1 = new Person() { Name = "Father 1" };
  280. var father2 = new CustomPerson() { Name = "Father 2" };
  281. var person1 = new Person() { Name = "Person 1", Father = father2 };
  282. var person2 = new CustomPerson() { Name = "Person 2", Father = father1 };
  283. s.Save(father1);
  284. s.Save(father2);
  285. s.Save(person1);
  286. s.Save(person2);
  287. t.Commit();
  288. }
  289. using (ISession s = OpenSession())
  290. {
  291. var actual =
  292. s.QueryOver<Person>()
  293. .Where(p => p is CustomPerson)
  294. .And(p => p.Father != null)
  295. .List();
  296. Assert.That(actual.Count, Is.EqualTo(1));
  297. Assert.That(actual[0].Name, Is.EqualTo("Person 2"));
  298. }
  299. using (ISession s = OpenSession())
  300. {
  301. var actual =
  302. s.QueryOver<Person>()
  303. .Where(p => p.GetType() == typeof(CustomPerson))
  304. .And(p => p.Father != null)
  305. .List();
  306. Assert.That(actual.Count, Is.EqualTo(1));
  307. Assert.That(actual[0].Name, Is.EqualTo("Person 2"));
  308. }
  309. using (ISession s = OpenSession())
  310. {
  311. Person f = null;
  312. var actual =
  313. s.QueryOver<Person>()
  314. .JoinAlias(p => p.Father, () => f)
  315. .Where(() => f is CustomPerson)
  316. .List();
  317. Assert.That(actual.Count, Is.EqualTo(1));
  318. Assert.That(actual[0].Name, Is.EqualTo("Person 1"));
  319. }
  320. using (ISession s = OpenSession())
  321. {
  322. Person f = null;
  323. var actual =
  324. s.QueryOver<Person>()
  325. .JoinAlias(p => p.Father, () => f)
  326. .Where(() => f.GetType() == typeof(CustomPerson))
  327. .List();
  328. Assert.That(actual.Count, Is.EqualTo(1));
  329. Assert.That(actual[0].Name, Is.EqualTo("Person 1"));
  330. }
  331. }
  332. [Test]
  333. public void SubCriteria()
  334. {
  335. using (ISession s = OpenSession())
  336. using (ITransaction t = s.BeginTransaction())
  337. {
  338. s.Save(new Person() { Name = "Name 1" }
  339. .AddChild(new Child() { Nickname = "Name 1.1"})
  340. .AddChild(new Child() { Nickname = "Name 1.2"}));
  341. s.Save(new Person() { Name = "Name 2" }
  342. .AddChild(new Child() { Nickname = "Name 2.1"})
  343. .AddChild(new Child() { Nickname = "Name 2.2"}));
  344. t.Commit();
  345. }
  346. using (ISession s = OpenSession())
  347. {
  348. var persons =
  349. s.QueryOver<Person>()
  350. .JoinQueryOver(p => p.Children)
  351. .Where(c => c.Nickname == "Name 2.1")
  352. .List();
  353. Assert.That(persons.Count, Is.EqualTo(1));
  354. Assert.That(persons[0].Name, Is.EqualTo("Name 2"));
  355. }
  356. }
  357. [Test]
  358. public void SubCriteriaProjections()
  359. {
  360. using (ISession s = OpenSession())
  361. using (ITransaction t = s.BeginTransaction())
  362. {
  363. s.Save(new Person() { Name = "Name 1", Age = 33 }
  364. .AddChild(new Child() { Nickname = "Name 1.1", Age = 3}));
  365. t.Commit();
  366. }
  367. using (ISession s = OpenSession())
  368. {
  369. var simpleProjection =
  370. s.QueryOver<Child>()
  371. .JoinQueryOver(c => c.Parent)
  372. .Where(p => p.Name == "Name 1" && p.Age == 33)
  373. .Select(c => c.Nickname, c => c.Age)
  374. .List<object[]>()
  375. .Select(props => new
  376. {
  377. Name = (string)props[0],
  378. Age = (int)props[1],
  379. });
  380. Assert.That(simpleProjection.Count(), Is.EqualTo(1));
  381. Assert.That(simpleProjection.First().Name, Is.EqualTo("Name 1.1"));
  382. Assert.That(simpleProjection.First().Age, Is.EqualTo(3));
  383. Child childAlias = null;
  384. var listProjection =
  385. s.QueryOver<Child>(() => childAlias)
  386. .JoinQueryOver(c => c.Parent)
  387. .Where(p => p.Name == "Name 1" && p.Age == 33)
  388. .SelectList(list => list
  389. .Select(c => childAlias.Nickname)
  390. .Select(c => c.Age))
  391. .List<object[]>()
  392. .Select(props => new
  393. {
  394. Name = (string)props[0],
  395. Age = (int)props[1],
  396. });
  397. Assert.That(listProjection.Count(), Is.EqualTo(1));
  398. Assert.That(listProjection.First().Name, Is.EqualTo("Name 1.1"));
  399. Assert.That(listProjection.First().Age, Is.EqualTo(3));
  400. }
  401. }
  402. [Test]
  403. public void SubQuery()
  404. {
  405. using (ISession s = OpenSession())
  406. using (ITransaction t = s.BeginTransaction())
  407. {
  408. s.Save(new Person() { Name = "Name 1", Age = 1 }
  409. .AddChild(new Child() { Nickname = "Name 1.1", Age = 1}));
  410. s.Save(new Person() { Name = "Name 2", Age = 2 }
  411. .AddChild(new Child() { Nickname = "Name 2.1", Age = 2})
  412. .AddChild(new Child() { Nickname = "Name 2.2", Age = 2}));
  413. s.Save(new Person() { Name = "Name 3", Age = 3 }
  414. .AddChild(new Child() { Nickname = "Name 3.1", Age = 3}));
  415. t.Commit();
  416. }
  417. using (ISession s = OpenSession())
  418. {
  419. Person personAlias = null;
  420. object childCountAlias = null;
  421. QueryOver<Child> averageChildAge =
  422. QueryOver.Of<Child>()
  423. .SelectList(list => list.SelectAvg(c => c.Age));
  424. QueryOver<Child> childCountQuery =
  425. QueryOver.Of<Child>()
  426. .Where(c => c.Parent.Id == personAlias.Id)
  427. .Select(Projections.RowCount());
  428. var nameAndChildCount =
  429. s.QueryOver<Person>(() => personAlias)
  430. .WithSubquery.Where(p => p.Age <= averageChildAge.As<int>())
  431. .SelectList(list => list
  432. .Select(p => p.Name)
  433. .SelectSubQuery(childCountQuery).WithAlias(() => childCountAlias))
  434. .OrderByAlias(() => childCountAlias).Desc
  435. .List<object[]>()
  436. .Select(props => new {
  437. Name = (string)props[0],
  438. ChildCount = (int)props[1],
  439. })
  440. .ToList();
  441. Assert.That(nameAndChildCount.Count, Is.EqualTo(2));
  442. Assert.That(nameAndChildCount[0].Name, Is.EqualTo("Name 2"));
  443. Assert.That(nameAndChildCount[0].ChildCount, Is.EqualTo(2));
  444. Assert.That(nameAndChildCount[1].Name, Is.EqualTo("Name 1"));
  445. Assert.That(nameAndChildCount[1].ChildCount, Is.EqualTo(1));
  446. }
  447. }
  448. [Test]
  449. public void OverrideEagerJoin()
  450. {
  451. using (ISession s = OpenSession())
  452. using (ITransaction t = s.BeginTransaction())
  453. {
  454. s.Save(new Parent()
  455. .AddChild(new JoinedChild())
  456. .AddChild(new JoinedChild()));
  457. t.Commit();
  458. }
  459. using (ISession s = OpenSession())
  460. {
  461. var persons =
  462. s.QueryOver<Parent>()
  463. .List();
  464. Assert.That(NHibernateUtil.IsInitialized(persons[0].Children), "Default query did not eagerly load children");
  465. }
  466. using (ISession s = OpenSession())
  467. {
  468. var persons =
  469. s.QueryOver<Parent>()
  470. .Fetch(p => p.Children).Lazy
  471. .List();
  472. Assert.That(persons.Count, Is.EqualTo(1));
  473. Assert.That(!NHibernateUtil.IsInitialized(persons[0].Children), "Children not lazy loaded");
  474. }
  475. }
  476. [Test]
  477. public void RowCount()
  478. {
  479. SetupPagingData();
  480. using (ISession s = OpenSession())
  481. {
  482. IQueryOver<Person> query =
  483. s.QueryOver<Person>()
  484. .JoinQueryOver(p => p.Children)
  485. .OrderBy(c => c.Age).Desc
  486. .Skip(2)
  487. .Take(1);
  488. IList<Person> results = query.List();
  489. int rowCount = query.RowCount();
  490. object bigRowCount = query.RowCountInt64();
  491. Assert.That(results.Count, Is.EqualTo(1));
  492. Assert.That(results[0].Name, Is.EqualTo("Name 3"));
  493. Assert.That(rowCount, Is.EqualTo(4));
  494. Assert.That(bigRowCount, Is.TypeOf<long>());
  495. Assert.That(bigRowCount, Is.EqualTo(4));
  496. }
  497. }
  498. [Test]
  499. public void Functions()
  500. {
  501. using (ISession s = OpenSession())
  502. using (ITransaction t = s.BeginTransaction())
  503. {
  504. s.Save(new Person() { Name = "p1", BirthDate = new DateTime(2009, 08, 07), Age = 90 });
  505. s.Save(new Person() { Name = "p2", BirthDate = new DateTime(2008, 07, 06) });
  506. s.Save(new Person() { Name = "pP3", BirthDate = new DateTime(2007, 06, 05) });
  507. t.Commit();
  508. }
  509. using (ISession s = OpenSession())
  510. {
  511. var persons =
  512. s.QueryOver<Person>()
  513. .Where(p => p.BirthDate.YearPart() == 2008)
  514. .List();
  515. persons.Count.Should().Be(1);
  516. persons[0].Name.Should().Be("p2");
  517. }
  518. using (ISession s = OpenSession())
  519. {
  520. var persons =
  521. s.QueryOver<Person>()
  522. .Where(p => p.BirthDate.YearPart().IsIn(new [] { 2008, 2009 }))
  523. .OrderBy(p => p.Name).Asc
  524. .List();
  525. persons.Count.Should().Be(2);
  526. persons[0].Name.Should().Be("p1");
  527. persons[1].Name.Should().Be("p2");
  528. }
  529. using (ISession s = OpenSession())
  530. {
  531. var yearOfBirth =
  532. s.QueryOver<Person>()
  533. .Where(p => p.Name == "p2")
  534. .Select(p => p.BirthDate.YearPart())
  535. .SingleOrDefault<object>();
  536. yearOfBirth.GetType().Should().Be(typeof(int));
  537. yearOfBirth.Should().Be(2008);
  538. }
  539. using (ISession s = OpenSession())
  540. {
  541. var avgYear =
  542. s.QueryOver<Person>()
  543. .SelectList(list => list.SelectAvg(p => p.BirthDate.YearPart()))
  544. .SingleOrDefault<object>();
  545. avgYear.GetType().Should().Be(typeof(double));
  546. string.Format("{0:0}", avgYear).Should().Be("2008");
  547. }
  548. using (ISession s = OpenSession())
  549. {
  550. var sqrtOfAge =
  551. s.QueryOver<Person>()
  552. .Where(p => p.Name == "p1")
  553. .Select(p => p.Age.Sqrt())
  554. .SingleOrDefault<object>();
  555. sqrtOfAge.Should().Be.InstanceOf<double>();
  556. string.Format("{0:0.00}", sqrtOfAge).Should().Be((9.49).ToString());
  557. }
  558. using (ISession s = OpenSession())
  559. {
  560. var names =
  561. s.QueryOver<Person>()
  562. .Where(p => p.Name == "pP3")
  563. .Select(p => p.Name.Lower(), p => p.Name.Upper())
  564. .SingleOrDefault<object[]>();
  565. names[0].Should().Be("pp3");
  566. names[1].Should().Be("PP3");
  567. }
  568. using (ISession s = OpenSession())
  569. {
  570. var name =
  571. s.QueryOver<Person>()
  572. .Where(p => p.Name == "p1")
  573. .Select(p => Projections.Concat(p.Name, ", ", p.Name))
  574. .SingleOrDefault<string>();
  575. name.Should().Be("p1, p1");
  576. }
  577. }
  578. [Test]
  579. public void FunctionsProperty()
  580. {
  581. using (ISession s = OpenSession())
  582. using (ITransaction t = s.BeginTransaction())
  583. {
  584. s.Save(new Person() { Name = "p1", BirthDate = new DateTime(2009, 08, 07) });
  585. s.Save(new Person() { Name = "p2", BirthDate = new DateTime(2008, 07, 07) });
  586. s.Save(new Person() { Name = "p3", BirthDate = new DateTime(2007, 06, 07) });
  587. t.Commit();
  588. }
  589. using (ISession s = OpenSession())
  590. {
  591. var persons =
  592. s.QueryOver<Person>()
  593. .Where(p => p.BirthDate.MonthPart() == p.BirthDate.DayPart())
  594. .List();
  595. persons.Count.Should().Be(1);
  596. persons[0].Name.Should().Be("p2");
  597. }
  598. }
  599. [Test]
  600. public void FunctionsOrder()
  601. {
  602. using (ISession s = OpenSession())
  603. using (ITransaction t = s.BeginTransaction())
  604. {
  605. s.Save(new Person() { Name = "p2", BirthDate = new DateTime(2008, 07, 06) });
  606. s.Save(new Person() { Name = "p1", BirthDate = new DateTime(2009, 08, 07) });
  607. s.Save(new Person() { Name = "p3", BirthDate = new DateTime(2007, 06, 05) });
  608. t.Commit();
  609. }
  610. using (ISession s = OpenSession())
  611. using (ITransaction t = s.BeginTransaction())
  612. {
  613. var persons =
  614. s.QueryOver<Person>()
  615. .OrderBy(p => p.BirthDate.YearPart()).Desc
  616. .List();
  617. persons.Count.Should().Be(3);
  618. persons[0].Name.Should().Be("p1");
  619. persons[1].Name.Should().Be("p2");
  620. persons[2].Name.Should().Be("p3");
  621. }
  622. }
  623. [Test]
  624. public void MultiCriteria()
  625. {
  626. SetupPagingData();
  627. using (ISession s = OpenSession())
  628. {
  629. IQueryOver<Person> query =
  630. s.QueryOver<Person>()
  631. .JoinQueryOver(p => p.Children)
  632. .OrderBy(c => c.Age).Desc
  633. .Skip(2)
  634. .Take(1);
  635. var multiCriteria =
  636. s.CreateMultiCriteria()
  637. .Add("page", query)
  638. .Add<int>("count", query.ToRowCountQuery());
  639. var pageResults = (IList<Person>) multiCriteria.GetResult("page");
  640. var countResults = (IList<int>) multiCriteria.GetResult("count");
  641. Assert.That(pageResults.Count, Is.EqualTo(1));
  642. Assert.That(pageResults[0].Name, Is.EqualTo("Name 3"));
  643. Assert.That(countResults.Count, Is.EqualTo(1));
  644. Assert.That(countResults[0], Is.EqualTo(4));
  645. }
  646. using (ISession s = OpenSession())
  647. {
  648. QueryOver<Person> query =
  649. QueryOver.Of<Person>()
  650. .JoinQueryOver(p => p.Children)
  651. .OrderBy(c => c.Age).Desc
  652. .Skip(2)
  653. .Take(1);
  654. var multiCriteria =
  655. s.CreateMultiCriteria()
  656. .Add("page", query)
  657. .Add<int>("count", query.ToRowCountQuery());
  658. var pageResults = (IList<Person>) multiCriteria.GetResult("page");
  659. var countResults = (IList<int>) multiCriteria.GetResult("count");
  660. Assert.That(pageResults.Count, Is.EqualTo(1));
  661. Assert.That(pageResults[0].Name, Is.EqualTo("Name 3"));
  662. Assert.That(countResults.Count, Is.EqualTo(1));
  663. Assert.That(countResults[0], Is.EqualTo(4));
  664. }
  665. }
  666. private void SetupPagingData()
  667. {
  668. using (ISession s = OpenSession())
  669. using (ITransaction t = s.BeginTransaction())
  670. {
  671. s.Save(new Person() { Name = "Name 1", Age = 1 }
  672. .AddChild(new Child() { Nickname = "Name 1.1", Age = 1}));
  673. s.Save(new Person() { Name = "Name 2", Age = 2 }
  674. .AddChild(new Child() { Nickname = "Name 2.1", Age = 3}));
  675. s.Save(new Person() { Name = "Name 3", Age = 3 }
  676. .AddChild(new Child() { Nickname = "Name 3.1", Age = 2}));
  677. s.Save(new Person() { Name = "Name 4", Age = 4 }
  678. .AddChild(new Child() { Nickname = "Name 4.1", Age = 4}));
  679. t.Commit();
  680. }
  681. }
  682. [Test]
  683. public void StatelessSession()
  684. {
  685. using (var ss = sessions.OpenStatelessSession())
  686. {
  687. using (var tx = ss.BeginTransaction())
  688. {
  689. var person = new Person() { Name = "test1" };
  690. ss.Insert(person);
  691. var statelessPerson1 =
  692. ss.QueryOver<Person>()
  693. .List()
  694. [0];
  695. Assert.That(statelessPerson1.Id, Is.EqualTo(person.Id));
  696. var statelessPerson2 =
  697. QueryOver.Of<Person>()
  698. .GetExecutableQueryOver(ss)
  699. .List()
  700. [0];
  701. Assert.That(statelessPerson2.Id, Is.EqualTo(person.Id));
  702. }
  703. }
  704. }
  705. }
  706. }