PageRenderTime 50ms CodeModel.GetById 23ms RepoModel.GetById 0ms app.codeStats 0ms

/src/NHibernate.Test/Linq/WhereTests.cs

https://github.com/cipatom/nhibernate-core
C# | 589 lines | 484 code | 101 blank | 4 comment | 40 complexity | 746f332d8d8d386a8949419ec5f0d7f5 MD5 | raw file
Possible License(s): Apache-2.0, CC-BY-SA-3.0, GPL-2.0, BSD-3-Clause, LGPL-2.1, MPL-2.0-no-copyleft-exception, LGPL-3.0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Linq.Expressions;
  5. using NHibernate.Linq;
  6. using NHibernate.DomainModel.Northwind.Entities;
  7. using NUnit.Framework;
  8. using SharpTestsEx;
  9. namespace NHibernate.Test.Linq
  10. {
  11. [TestFixture]
  12. public class WhereTests : LinqTestCase
  13. {
  14. [Test]
  15. public void NoWhereClause()
  16. {
  17. var query = (from user in db.Users
  18. select user).ToList();
  19. Assert.AreEqual(3, query.Count);
  20. }
  21. [Test]
  22. public void OrWithTrueReducesTo1Eq1Clause()
  23. {
  24. var query = (from user in db.Users
  25. where user.Name == "ayende" || true
  26. select user).ToList();
  27. Assert.AreEqual(3, query.Count);
  28. }
  29. [Test]
  30. public void AndWithTrueReducesTo1Eq0Clause()
  31. {
  32. var query = (from user in db.Users
  33. where user.Name == "ayende" && false
  34. select user).ToList();
  35. Assert.AreEqual(0, query.Count);
  36. }
  37. [Test]
  38. public void WhereWithConstantExpression()
  39. {
  40. var query = (from user in db.Users
  41. where user.Name == "ayende"
  42. select user).ToList();
  43. Assert.AreEqual(1, query.Count);
  44. }
  45. [Test]
  46. public void FirstElementWithWhere()
  47. {
  48. var query = (from user in db.Users
  49. where user.Name == "ayende"
  50. select user).First();
  51. Assert.AreEqual("ayende", query.Name);
  52. }
  53. [Test]
  54. [ExpectedException(typeof(InvalidOperationException))]
  55. public void FirstElementWithQueryThatReturnsNoResults()
  56. {
  57. var query = (from user in db.Users
  58. where user.Name == "xxx"
  59. select user).First();
  60. }
  61. [Test]
  62. public void FirstOrDefaultElementWithQueryThatReturnsNoResults()
  63. {
  64. var query = (from user in db.Users
  65. where user.Name == "xxx"
  66. select user).FirstOrDefault();
  67. Assert.IsNull(query);
  68. }
  69. [Test]
  70. [ExpectedException(typeof(InvalidOperationException))]
  71. public void SingleElementWithQueryThatReturnsNoResults()
  72. {
  73. var query = (from user in db.Users
  74. where user.Name == "xxx"
  75. select user).Single();
  76. }
  77. [Test]
  78. [ExpectedException(typeof(InvalidOperationException))]
  79. public void SingleElementWithQueryThatReturnsMultipleResults()
  80. {
  81. var query = (from user in db.Users
  82. select user).Single();
  83. }
  84. [Test]
  85. public void SingleOrDefaultElementWithQueryThatReturnsNoResults()
  86. {
  87. var query = (from user in db.Users
  88. where user.Name == "xxx"
  89. select user).SingleOrDefault();
  90. Assert.IsNull(query);
  91. }
  92. [Test]
  93. public void UsersRegisteredAtOrAfterY2K()
  94. {
  95. var query = (from user in db.Users
  96. where user.RegisteredAt >= new DateTime(2000, 1, 1)
  97. select user).ToList();
  98. Assert.AreEqual(2, query.Count);
  99. }
  100. [Test]
  101. public void UsersRegisteredAtOrAfterY2K_And_Before2001()
  102. {
  103. var query = (from user in db.Users
  104. where user.RegisteredAt >= new DateTime(2000, 1, 1) && user.RegisteredAt <= new DateTime(2001, 1, 1)
  105. select user).ToList();
  106. Assert.AreEqual(1, query.Count);
  107. }
  108. [Test]
  109. public void UsersByNameAndRegistrationDate()
  110. {
  111. var query = (from user in db.Users
  112. where user.Name == "ayende" && user.RegisteredAt == new DateTime(2010, 06, 17)
  113. select user).FirstOrDefault();
  114. Assert.IsNotNull(query);
  115. Assert.AreEqual("ayende", query.Name);
  116. Assert.AreEqual(new DateTime(2010, 06, 17), query.RegisteredAt);
  117. }
  118. [Test]
  119. public void UsersRegisteredAfterY2K()
  120. {
  121. var query = (from user in db.Users
  122. where user.RegisteredAt > new DateTime(2000, 1, 1)
  123. select user).ToList();
  124. Assert.AreEqual(1, query.Count);
  125. }
  126. [Test]
  127. public void UsersRegisteredAtOrBeforeY2K()
  128. {
  129. var query = (from user in db.Users
  130. where user.RegisteredAt <= new DateTime(2000, 1, 1)
  131. select user).ToList();
  132. Assert.AreEqual(2, query.Count);
  133. }
  134. [Test]
  135. public void UsersRegisteredBeforeY2K()
  136. {
  137. var query = (from user in db.Users
  138. where user.RegisteredAt < new DateTime(2000, 1, 1)
  139. select user).ToList();
  140. Assert.AreEqual(1, query.Count);
  141. }
  142. [Test]
  143. public void UsersRegisteredAtOrBeforeY2KAndNamedNHibernate()
  144. {
  145. var query = (from user in db.Users
  146. where user.RegisteredAt <= new DateTime(2000, 1, 1) && user.Name == "nhibernate"
  147. select user).ToList();
  148. Assert.AreEqual(1, query.Count);
  149. }
  150. [Test]
  151. public void UsersRegisteredAtOrBeforeY2KOrNamedNHibernate()
  152. {
  153. var query = (from user in db.Users
  154. where user.RegisteredAt <= new DateTime(2000, 1, 1) || user.Name == "nhibernate"
  155. select user).ToList();
  156. Assert.AreEqual(2, query.Count);
  157. }
  158. [Test]
  159. public void TestDataContext()
  160. {
  161. var query = from u in db.Users
  162. where u.Name == "ayende"
  163. select u;
  164. Assert.AreEqual(1, query.Count());
  165. }
  166. [Test]
  167. public void UsersWithNullLoginDate()
  168. {
  169. var query = (from user in db.Users
  170. where user.LastLoginDate == null
  171. select user).ToList();
  172. CollectionAssert.AreCountEqual(2, query);
  173. }
  174. [Test]
  175. public void UsersWithNonNullLoginDate()
  176. {
  177. var query = (from user in db.Users
  178. where user.LastLoginDate != null
  179. select user).ToList();
  180. CollectionAssert.AreCountEqual(1, query);
  181. }
  182. [Test]
  183. public void UsersWithDynamicInvokedExpression()
  184. {
  185. //simulate dynamically created where clause
  186. Expression<Func<User, bool>> expr1 = u => u.Name == "ayende";
  187. Expression<Func<User, bool>> expr2 = u => u.Name == "rahien";
  188. var invokedExpr = Expression.Invoke(expr2, expr1.Parameters.Cast<Expression>());
  189. var dynamicWhereClause = Expression.Lambda<Func<User, bool>>
  190. (Expression.OrElse(expr1.Body, invokedExpr), expr1.Parameters);
  191. var query = db.Users.Where(dynamicWhereClause).ToList();
  192. CollectionAssert.AreCountEqual(2, query);
  193. }
  194. [Test]
  195. public void UsersWithComponentProperties()
  196. {
  197. var query = from user in db.Users
  198. where user.Component.Property1 == "test1"
  199. select user;
  200. var list = query.ToList();
  201. CollectionAssert.AreCountEqual(1, list);
  202. }
  203. [Test]
  204. public void UsersWithNestedComponentProperties()
  205. {
  206. var query = from user in db.Users
  207. where user.Component.OtherComponent.OtherProperty1 == "othertest1"
  208. select user;
  209. var list = query.ToList();
  210. CollectionAssert.AreCountEqual(1, list);
  211. }
  212. [Test]
  213. public void UsersWithAssociatedEntityProperties()
  214. {
  215. var query = from user in db.Users
  216. where user.Role.Name == "Admin" && user.Role.IsActive
  217. select new { user.Name, RoleName = user.Role.Name };
  218. var list = query.ToList();
  219. CollectionAssert.AreCountEqual(1, list);
  220. }
  221. [Test]
  222. public void UsersWithEntityPropertiesThreeLevelsDeep()
  223. {
  224. var query = from user in db.Users
  225. where user.Role.Entity.Output != null
  226. select new
  227. {
  228. user.Name,
  229. RoleName = user.Role.Name,
  230. user.Role.Entity.Output
  231. };
  232. var list = query.ToList();
  233. CollectionAssert.AreCountEqual(1, list);
  234. }
  235. [Test]
  236. public void UsersWithoutRole()
  237. {
  238. var query = from user in db.Users
  239. where user.Role == null
  240. select new { user.Name, RoleName = user.Role.Name };
  241. var list = query.ToList();
  242. CollectionAssert.AreCountEqual(1, list);
  243. }
  244. [Test]
  245. public void UsersWithRole()
  246. {
  247. var query = from user in db.Users
  248. where user.Role != null
  249. select new { user.Name, RoleName = user.Role.Name };
  250. var list = query.ToList();
  251. CollectionAssert.AreCountEqual(2, list);
  252. }
  253. [Test]
  254. public void UsersWithStringContains()
  255. {
  256. var query = (from user in db.Users
  257. where user.Name.Contains("yend")
  258. select user).ToList();
  259. Assert.AreEqual(1, query.Count);
  260. }
  261. [Test]
  262. public void UsersWithArrayContains()
  263. {
  264. var names = new[] { "ayende", "rahien" };
  265. var query = (from user in db.Users
  266. where names.Contains(user.Name)
  267. select user).ToList();
  268. Assert.AreEqual(2, query.Count);
  269. }
  270. [Test]
  271. public void UsersWithListContains()
  272. {
  273. var names = new List<string> { "ayende", "rahien" };
  274. var query = (from user in db.Users
  275. where names.Contains(user.Name)
  276. select user).ToList();
  277. Assert.AreEqual(2, query.Count);
  278. }
  279. [Test]
  280. public void UsersWithEmptyList_NH2400()
  281. {
  282. var names = new List<string>();
  283. var query = (from user in db.Users
  284. where names.Contains(user.Name)
  285. select user).ToList();
  286. Assert.That(query.Count, Is.EqualTo(0));
  287. }
  288. [Test]
  289. public void UsersWithEmptyEnumerable()
  290. {
  291. var allNames = new List<string> { "ayende", "rahien" };
  292. var names = allNames.Where(n => n == "does not exist");
  293. var query = (from user in db.Users
  294. where names.Contains(user.Name)
  295. select user).ToList();
  296. Assert.That(query.Count, Is.EqualTo(0));
  297. }
  298. [Test]
  299. [Ignore("inline empty list expression does not evaluate correctly")]
  300. public void UsersWithEmptyInlineEnumerable()
  301. {
  302. var allNames = new List<string> { "ayende", "rahien" };
  303. var query = (from user in db.Users
  304. where allNames.Where(n => n == "does not exist").Contains(user.Name)
  305. select user).ToList();
  306. Assert.That(query.Count, Is.EqualTo(0));
  307. }
  308. [Test]
  309. public void WhenTheSourceOfConstantIsICollectionThenNoThrows()
  310. {
  311. ICollection<string> names = new List<string> {"ayende", "rahien"};
  312. var query = (from user in db.Users
  313. where names.Contains(user.Name)
  314. select user);
  315. List<User> result = null;
  316. Executing.This(() => result = query.ToList()).Should().NotThrow();
  317. result.Count.Should().Be(2);
  318. }
  319. [Test]
  320. public void WhenTheSourceOfConstantIsIListThenNoThrows()
  321. {
  322. IList<string> names = new List<string> { "ayende", "rahien" };
  323. var query = (from user in db.Users
  324. where names.Contains(user.Name)
  325. select user);
  326. List<User> result = null;
  327. Executing.This(() => result = query.ToList()).Should().NotThrow();
  328. result.Count.Should().Be(2);
  329. }
  330. [Test]
  331. public void TimesheetsWithCollectionContains()
  332. {
  333. var entry = session.Get<TimesheetEntry>(1);
  334. var timesheet = (from sheet in db.Timesheets
  335. where sheet.Entries.Contains(entry)
  336. select sheet).Single();
  337. Assert.AreEqual(2, timesheet.Id);
  338. }
  339. [Test]
  340. public void UsersWithStringNotContains()
  341. {
  342. var query = (from user in db.Users
  343. where !user.Name.Contains("yend")
  344. select user).ToList();
  345. Assert.AreEqual(2, query.Count);
  346. }
  347. [Test]
  348. public void UsersWithArrayNotContains()
  349. {
  350. var names = new[] { "ayende", "rahien" };
  351. var query = (from user in db.Users
  352. where !names.Contains(user.Name)
  353. select user).ToList();
  354. Assert.AreEqual(1, query.Count);
  355. }
  356. [Test]
  357. public void UsersWithListNotContains()
  358. {
  359. var names = new List<string> { "ayende", "rahien" };
  360. var query = (from user in db.Users
  361. where !names.Contains(user.Name)
  362. select user).ToList();
  363. Assert.AreEqual(1, query.Count);
  364. }
  365. [Test]
  366. public void TimesheetsWithCollectionNotContains()
  367. {
  368. var entry = session.Get<TimesheetEntry>(1);
  369. var query = (from sheet in db.Timesheets
  370. where !sheet.Entries.Contains(entry)
  371. select sheet).ToList();
  372. Assert.AreEqual(2, query.Count);
  373. }
  374. [Test]
  375. public void TimesheetsWithEnumerableContains()
  376. {
  377. var user = session.Get<User>(1);
  378. var query = (from sheet in db.Timesheets
  379. where sheet.Users.Contains(user)
  380. select sheet).ToList();
  381. Assert.AreEqual(2, query.Count);
  382. }
  383. [Test]
  384. public void SearchOnObjectTypeWithExtensionMethod()
  385. {
  386. var query = (from o in session.Query<Animal>()
  387. select o).OfType<Dog>().ToList();
  388. Assert.AreEqual(2, query.Count);
  389. }
  390. [Test(Description = "Reported as bug NH-2206")]
  391. public void SearchOnObjectTypeUpCastWithExtensionMethod()
  392. {
  393. var query = (from o in session.Query<Dog>()
  394. select o).Cast<Animal>().ToList();
  395. Assert.AreEqual(2, query.Count);
  396. }
  397. [Test(Description = "Reported as bug NH-2206")]
  398. public void SearchOnObjectTypeCast()
  399. {
  400. var query = (from Dog o in session.Query<Dog>()
  401. select o).ToList();
  402. Assert.AreEqual(2, query.Count);
  403. }
  404. [Test]
  405. public void SearchOnObjectTypeWithIsKeyword()
  406. {
  407. var query = (from o in session.Query<Animal>()
  408. where o is Dog
  409. select o).ToList();
  410. Assert.AreEqual(2, query.Count);
  411. }
  412. [Test]
  413. public void BitwiseQuery()
  414. {
  415. var featureSet = FeatureSet.HasMore;
  416. var query = (from o in session.Query<User>()
  417. where (o.Features & featureSet) == featureSet
  418. select o).ToList();
  419. Assert.IsNotNull(query);
  420. }
  421. [Test]
  422. public void BitwiseQuery2()
  423. {
  424. var featureSet = FeatureSet.HasAll;
  425. var query = (from o in session.Query<User>()
  426. where (o.Features & featureSet) == featureSet
  427. select o).ToList();
  428. Assert.AreEqual(1, query.Count);
  429. }
  430. [Test]
  431. public void BitwiseQuery3()
  432. {
  433. var featureSet = FeatureSet.HasThat;
  434. var query = (from o in session.Query<User>()
  435. where ((o.Features | featureSet) & featureSet) == featureSet
  436. select o).ToList();
  437. Assert.AreEqual(3, query.Count);
  438. }
  439. [Test]
  440. public void OfTypeWithWhereAndProjection()
  441. {
  442. // NH-2375
  443. (from a
  444. in session.Query<Animal>().OfType<Cat>()
  445. where a.Pregnant
  446. select a.Id).FirstOrDefault();
  447. }
  448. [Test]
  449. public void OfTypeWithWhere()
  450. {
  451. // NH-2375
  452. (from a
  453. in session.Query<Animal>().OfType<Cat>()
  454. where a.Pregnant
  455. select a).FirstOrDefault();
  456. }
  457. [Test]
  458. public void TimeSheetsWithSamePredicateTwoTimes()
  459. {
  460. //NH-3009
  461. Expression<Func<Timesheet, bool>> predicate = timesheet => timesheet.Entries.Any(e => e.Id != 1);
  462. var query = db.Timesheets
  463. .Where(predicate)
  464. .Where(predicate)
  465. .ToList();
  466. Assert.AreEqual(2, query.Count);
  467. }
  468. [Test]
  469. public void AnimalsWithFathersSerialNumberListContains()
  470. {
  471. var serialNumbers = new List<string> { "5678", "789" };
  472. var query = (from animal in db.Animals
  473. where animal.Father != null && serialNumbers.Contains(animal.Father.SerialNumber)
  474. select animal).ToList();
  475. Assert.AreEqual(1, query.Count);
  476. }
  477. [Test]
  478. public void AnimalsWithFathersSerialNumberListContainsWithLocalVariable()
  479. {
  480. var serialNumbers = new List<string> { "5678", "789" };
  481. var query = (from animal in db.Animals
  482. let father = animal.Father
  483. where father != null && serialNumbers.Contains(father.SerialNumber)
  484. select animal).ToList();
  485. Assert.AreEqual(1, query.Count);
  486. }
  487. }
  488. }