PageRenderTime 52ms CodeModel.GetById 20ms RepoModel.GetById 0ms app.codeStats 1ms

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

https://github.com/okb/nhibernate-core
C# | 629 lines | 508 code | 109 blank | 12 comment | 44 complexity | 20f6eeeb823a673912ab8fc3c5bc009c 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.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 UsersWithStringContainsAndNotNullNameComplicated()
  263. {
  264. // NH-3330
  265. // Queries in this pattern are apparently generated by
  266. // e.g. WCF DS query:
  267. // http://.../Products()?$filter=substringof(&#39;123&#39;,Code)
  268. // ReSharper disable SimplifyConditionalTernaryExpression
  269. var query = db.Users
  270. .Where(user =>
  271. (user.Name == null ? null : (bool?)user.Name.Contains("123")) == null
  272. ? false
  273. : (user.Name == null ? null : (bool?)user.Name.Contains("123")).Value);
  274. // ReSharper restore SimplifyConditionalTernaryExpression
  275. query.ToList();
  276. }
  277. [Test]
  278. public void UsersWithStringContainsAndNotNullName()
  279. {
  280. //NH-3261
  281. var query = (from u in db.Users
  282. where u.Name == null ? false : u.Name.Contains("yend")
  283. select u).ToList();
  284. Assert.AreEqual(1, query.Count);
  285. }
  286. [Test]
  287. public void UsersWithStringContainsAndNotNullNameHQL()
  288. {
  289. //NH-3261
  290. var users = session.CreateQuery("from User u where (case when u.Name is null then 'false' else (case when u.Name LIKE '%yend%' then 'true' else 'false' end) end) = 'true'").List<User>();
  291. Assert.AreEqual(1, users.Count);
  292. }
  293. [Test]
  294. public void UsersWithArrayContains()
  295. {
  296. var names = new[] { "ayende", "rahien" };
  297. var query = (from user in db.Users
  298. where names.Contains(user.Name)
  299. select user).ToList();
  300. Assert.AreEqual(2, query.Count);
  301. }
  302. [Test]
  303. public void UsersWithListContains()
  304. {
  305. var names = new List<string> { "ayende", "rahien" };
  306. var query = (from user in db.Users
  307. where names.Contains(user.Name)
  308. select user).ToList();
  309. Assert.AreEqual(2, query.Count);
  310. }
  311. [Test]
  312. public void UsersWithEmptyList_NH2400()
  313. {
  314. var names = new List<string>();
  315. var query = (from user in db.Users
  316. where names.Contains(user.Name)
  317. select user).ToList();
  318. Assert.That(query.Count, Is.EqualTo(0));
  319. }
  320. [Test]
  321. public void UsersWithEmptyEnumerable()
  322. {
  323. var allNames = new List<string> { "ayende", "rahien" };
  324. var names = allNames.Where(n => n == "does not exist");
  325. var query = (from user in db.Users
  326. where names.Contains(user.Name)
  327. select user).ToList();
  328. Assert.That(query.Count, Is.EqualTo(0));
  329. }
  330. [Test]
  331. [Ignore("inline empty list expression does not evaluate correctly")]
  332. public void UsersWithEmptyInlineEnumerable()
  333. {
  334. var allNames = new List<string> { "ayende", "rahien" };
  335. var query = (from user in db.Users
  336. where allNames.Where(n => n == "does not exist").Contains(user.Name)
  337. select user).ToList();
  338. Assert.That(query.Count, Is.EqualTo(0));
  339. }
  340. [Test]
  341. public void WhenTheSourceOfConstantIsICollectionThenNoThrows()
  342. {
  343. ICollection<string> names = new List<string> {"ayende", "rahien"};
  344. var query = (from user in db.Users
  345. where names.Contains(user.Name)
  346. select user);
  347. List<User> result = null;
  348. Executing.This(() => result = query.ToList()).Should().NotThrow();
  349. result.Count.Should().Be(2);
  350. }
  351. [Test]
  352. public void WhenTheSourceOfConstantIsIListThenNoThrows()
  353. {
  354. IList<string> names = new List<string> { "ayende", "rahien" };
  355. var query = (from user in db.Users
  356. where names.Contains(user.Name)
  357. select user);
  358. List<User> result = null;
  359. Executing.This(() => result = query.ToList()).Should().NotThrow();
  360. result.Count.Should().Be(2);
  361. }
  362. [Test]
  363. public void TimesheetsWithCollectionContains()
  364. {
  365. var entry = session.Get<TimesheetEntry>(1);
  366. var timesheet = (from sheet in db.Timesheets
  367. where sheet.Entries.Contains(entry)
  368. select sheet).Single();
  369. Assert.AreEqual(2, timesheet.Id);
  370. }
  371. [Test]
  372. public void UsersWithStringNotContains()
  373. {
  374. var query = (from user in db.Users
  375. where !user.Name.Contains("yend")
  376. select user).ToList();
  377. Assert.AreEqual(2, query.Count);
  378. }
  379. [Test]
  380. public void UsersWithArrayNotContains()
  381. {
  382. var names = new[] { "ayende", "rahien" };
  383. var query = (from user in db.Users
  384. where !names.Contains(user.Name)
  385. select user).ToList();
  386. Assert.AreEqual(1, query.Count);
  387. }
  388. [Test]
  389. public void UsersWithListNotContains()
  390. {
  391. var names = new List<string> { "ayende", "rahien" };
  392. var query = (from user in db.Users
  393. where !names.Contains(user.Name)
  394. select user).ToList();
  395. Assert.AreEqual(1, query.Count);
  396. }
  397. [Test]
  398. public void TimesheetsWithCollectionNotContains()
  399. {
  400. var entry = session.Get<TimesheetEntry>(1);
  401. var query = (from sheet in db.Timesheets
  402. where !sheet.Entries.Contains(entry)
  403. select sheet).ToList();
  404. Assert.AreEqual(2, query.Count);
  405. }
  406. [Test]
  407. public void TimesheetsWithEnumerableContains()
  408. {
  409. var user = session.Get<User>(1);
  410. var query = (from sheet in db.Timesheets
  411. where sheet.Users.Contains(user)
  412. select sheet).ToList();
  413. Assert.AreEqual(2, query.Count);
  414. }
  415. [Test]
  416. public void SearchOnObjectTypeWithExtensionMethod()
  417. {
  418. var query = (from o in session.Query<Animal>()
  419. select o).OfType<Dog>().ToList();
  420. Assert.AreEqual(2, query.Count);
  421. }
  422. [Test(Description = "Reported as bug NH-2206")]
  423. public void SearchOnObjectTypeUpCastWithExtensionMethod()
  424. {
  425. var query = (from o in session.Query<Dog>()
  426. select o).Cast<Animal>().ToList();
  427. Assert.AreEqual(2, query.Count);
  428. }
  429. [Test(Description = "Reported as bug NH-2206")]
  430. public void SearchOnObjectTypeCast()
  431. {
  432. var query = (from Dog o in session.Query<Dog>()
  433. select o).ToList();
  434. Assert.AreEqual(2, query.Count);
  435. }
  436. [Test]
  437. public void SearchOnObjectTypeWithIsKeyword()
  438. {
  439. var query = (from o in session.Query<Animal>()
  440. where o is Dog
  441. select o).ToList();
  442. Assert.AreEqual(2, query.Count);
  443. }
  444. [Test]
  445. public void BitwiseQuery()
  446. {
  447. var featureSet = FeatureSet.HasMore;
  448. var query = (from o in session.Query<User>()
  449. where (o.Features & featureSet) == featureSet
  450. select o).ToList();
  451. Assert.IsNotNull(query);
  452. }
  453. [Test]
  454. public void BitwiseQuery2()
  455. {
  456. var featureSet = FeatureSet.HasAll;
  457. var query = (from o in session.Query<User>()
  458. where (o.Features & featureSet) == featureSet
  459. select o).ToList();
  460. Assert.AreEqual(1, query.Count);
  461. }
  462. [Test]
  463. public void BitwiseQuery3()
  464. {
  465. var featureSet = FeatureSet.HasThat;
  466. var query = (from o in session.Query<User>()
  467. where ((o.Features | featureSet) & featureSet) == featureSet
  468. select o).ToList();
  469. Assert.AreEqual(3, query.Count);
  470. }
  471. [Test]
  472. public void OfTypeWithWhereAndProjection()
  473. {
  474. // NH-2375
  475. (from a
  476. in session.Query<Animal>().OfType<Cat>()
  477. where a.Pregnant
  478. select a.Id).FirstOrDefault();
  479. }
  480. [Test]
  481. public void OfTypeWithWhere()
  482. {
  483. // NH-2375
  484. (from a
  485. in session.Query<Animal>().OfType<Cat>()
  486. where a.Pregnant
  487. select a).FirstOrDefault();
  488. }
  489. [Test]
  490. public void TimeSheetsWithSamePredicateTwoTimes()
  491. {
  492. //NH-3009
  493. Expression<Func<Timesheet, bool>> predicate = timesheet => timesheet.Entries.Any(e => e.Id != 1);
  494. var query = db.Timesheets
  495. .Where(predicate)
  496. .Where(predicate)
  497. .ToList();
  498. Assert.AreEqual(2, query.Count);
  499. }
  500. [Test]
  501. public void AnimalsWithFathersSerialNumberListContains()
  502. {
  503. var serialNumbers = new List<string> { "5678", "789" };
  504. var query = (from animal in db.Animals
  505. where animal.Father != null && serialNumbers.Contains(animal.Father.SerialNumber)
  506. select animal).ToList();
  507. Assert.AreEqual(1, query.Count);
  508. }
  509. [Test]
  510. public void AnimalsWithFathersSerialNumberListContainsWithLocalVariable()
  511. {
  512. var serialNumbers = new List<string> { "5678", "789" };
  513. var query = (from animal in db.Animals
  514. let father = animal.Father
  515. where father != null && serialNumbers.Contains(father.SerialNumber)
  516. select animal).ToList();
  517. Assert.AreEqual(1, query.Count);
  518. }
  519. }
  520. }