PageRenderTime 55ms CodeModel.GetById 8ms RepoModel.GetById 0ms app.codeStats 0ms

/src/NHibernate.Test/Linq/WhereSubqueryTests.cs

https://github.com/okb/nhibernate-core
C# | 551 lines | 427 code | 102 blank | 22 comment | 16 complexity | e5f3192d6b6af976eff93e4c1d05b561 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.Linq;
  3. using System.Linq.Expressions;
  4. using NHibernate.DomainModel.Northwind.Entities;
  5. using NUnit.Framework;
  6. namespace NHibernate.Test.Linq
  7. {
  8. [TestFixture]
  9. public class WhereSubqueryTests : LinqTestCase
  10. {
  11. protected override void Configure(Cfg.Configuration configuration)
  12. {
  13. configuration.SetProperty(Cfg.Environment.ShowSql, "true");
  14. base.Configure(configuration);
  15. }
  16. [Test]
  17. public void TimesheetsWithNoEntries()
  18. {
  19. var query = (from timesheet in db.Timesheets
  20. where !timesheet.Entries.Any()
  21. select timesheet).ToList();
  22. Assert.AreEqual(1, query.Count);
  23. }
  24. [Test]
  25. public void TimeSheetsWithCountSubquery()
  26. {
  27. var query = (from timesheet in db.Timesheets
  28. where timesheet.Entries.Count() >= 1
  29. select timesheet).ToList();
  30. Assert.AreEqual(2, query.Count);
  31. }
  32. [Test]
  33. public void TimeSheetsWithCountSubqueryReversed()
  34. {
  35. var query = (from timesheet in db.Timesheets
  36. where 1 <= timesheet.Entries.Count()
  37. select timesheet).ToList();
  38. Assert.AreEqual(2, query.Count);
  39. }
  40. [Test]
  41. public void TimeSheetsWithCountSubqueryComparedToProperty()
  42. {
  43. var query = (from timesheet in db.Timesheets
  44. where timesheet.Entries.Count() > timesheet.Id
  45. select timesheet).ToList();
  46. Assert.AreEqual(1, query.Count);
  47. }
  48. [Test]
  49. public void TimeSheetsWithCountSubqueryComparedToPropertyReversed()
  50. {
  51. var query = (from timesheet in db.Timesheets
  52. where timesheet.Id < timesheet.Entries.Count()
  53. select timesheet).ToList();
  54. Assert.AreEqual(1, query.Count);
  55. }
  56. [Test]
  57. public void TimeSheetsWithAverageSubquery()
  58. {
  59. var query = (from timesheet in db.Timesheets
  60. where timesheet.Entries.Average(e => e.NumberOfHours) > 12
  61. select timesheet).ToList();
  62. Assert.AreEqual(1, query.Count);
  63. }
  64. [Test]
  65. public void TimeSheetsWithAverageSubqueryReversed()
  66. {
  67. var query = (from timesheet in db.Timesheets
  68. where 12 < timesheet.Entries.Average(e => e.NumberOfHours)
  69. select timesheet).ToList();
  70. Assert.AreEqual(1, query.Count);
  71. }
  72. [Test]
  73. [Ignore("Need to coalesce the subquery - timesheet with no entries should return average of 0, not null")]
  74. public void TimeSheetsWithAverageSubqueryComparedToProperty()
  75. {
  76. var query = (from timesheet in db.Timesheets
  77. where timesheet.Entries.Average(e => e.NumberOfHours) < timesheet.Id
  78. select timesheet).ToList();
  79. Assert.AreEqual(1, query.Count);
  80. }
  81. [Test]
  82. [Ignore("Need to coalesce the subquery - timesheet with no entries should return average of 0, not null")]
  83. public void TimeSheetsWithAverageSubqueryComparedToPropertyReversed()
  84. {
  85. var query = (from timesheet in db.Timesheets
  86. where timesheet.Id > timesheet.Entries.Average(e => e.NumberOfHours)
  87. select timesheet).ToList();
  88. Assert.AreEqual(1, query.Count);
  89. }
  90. [Test]
  91. public void TimeSheetsWithMaxSubquery()
  92. {
  93. var query = (from timesheet in db.Timesheets
  94. where timesheet.Entries.Max(e => e.NumberOfHours) == 14
  95. select timesheet).ToList();
  96. Assert.AreEqual(1, query.Count);
  97. }
  98. [Test]
  99. public void TimeSheetsWithMaxSubqueryReversed()
  100. {
  101. var query = (from timesheet in db.Timesheets
  102. where 14 == timesheet.Entries.Max(e => e.NumberOfHours)
  103. select timesheet).ToList();
  104. Assert.AreEqual(1, query.Count);
  105. }
  106. [Test]
  107. public void TimeSheetsWithMaxSubqueryComparedToProperty()
  108. {
  109. var query = (from timesheet in db.Timesheets
  110. where timesheet.Entries.Max(e => e.NumberOfHours) > timesheet.Id
  111. select timesheet).ToList();
  112. Assert.AreEqual(2, query.Count);
  113. }
  114. [Test]
  115. public void TimeSheetsWithMaxSubqueryComparedToPropertyReversed()
  116. {
  117. var query = (from timesheet in db.Timesheets
  118. where timesheet.Id < timesheet.Entries.Max(e => e.NumberOfHours)
  119. select timesheet).ToList();
  120. Assert.AreEqual(2, query.Count);
  121. }
  122. [Test]
  123. public void TimeSheetsWithMinSubquery()
  124. {
  125. var query = (from timesheet in db.Timesheets
  126. where timesheet.Entries.Min(e => e.NumberOfHours) < 7
  127. select timesheet).ToList();
  128. Assert.AreEqual(2, query.Count);
  129. }
  130. [Test]
  131. public void TimeSheetsWithMinSubqueryReversed()
  132. {
  133. var query = (from timesheet in db.Timesheets
  134. where 7 > timesheet.Entries.Min(e => e.NumberOfHours)
  135. select timesheet).ToList();
  136. Assert.AreEqual(2, query.Count);
  137. }
  138. [Test]
  139. public void TimeSheetsWithMinSubqueryComparedToProperty()
  140. {
  141. var query = (from timesheet in db.Timesheets
  142. where timesheet.Entries.Min(e => e.NumberOfHours) > timesheet.Id
  143. select timesheet).ToList();
  144. Assert.AreEqual(2, query.Count);
  145. }
  146. [Test]
  147. public void TimeSheetsWithMinSubqueryComparedToPropertyReversed()
  148. {
  149. var query = (from timesheet in db.Timesheets
  150. where timesheet.Id < timesheet.Entries.Min(e => e.NumberOfHours)
  151. select timesheet).ToList();
  152. Assert.AreEqual(2, query.Count);
  153. }
  154. [Test]
  155. public void TimeSheetsWithSumSubquery()
  156. {
  157. var query = (from timesheet in db.Timesheets
  158. where timesheet.Entries.Sum(e => e.NumberOfHours) <= 20
  159. select timesheet).ToList();
  160. Assert.AreEqual(1, query.Count);
  161. }
  162. [Test]
  163. public void TimeSheetsWithSumSubqueryReversed()
  164. {
  165. var query = (from timesheet in db.Timesheets
  166. where 20 >= timesheet.Entries.Sum(e => e.NumberOfHours)
  167. select timesheet).ToList();
  168. Assert.AreEqual(1, query.Count);
  169. }
  170. [Test]
  171. [Ignore("Need to coalesce the subquery - timesheet with no entries should return sum of 0, not null")]
  172. public void TimeSheetsWithSumSubqueryComparedToProperty()
  173. {
  174. var query = (from timesheet in db.Timesheets
  175. where timesheet.Entries.Sum(e => e.NumberOfHours) <= timesheet.Id
  176. select timesheet).ToList();
  177. Assert.AreEqual(1, query.Count);
  178. }
  179. [Test]
  180. [Ignore("Need to coalesce the subquery - timesheet with no entries should return sum of 0, not null")]
  181. public void TimeSheetsWithSumSubqueryComparedToPropertyReversed()
  182. {
  183. var query = (from timesheet in db.Timesheets
  184. where timesheet.Id >= timesheet.Entries.Sum(e => e.NumberOfHours)
  185. select timesheet).ToList();
  186. Assert.AreEqual(1, query.Count);
  187. }
  188. [Test]
  189. public void TimeSheetsWithStringContainsSubQuery()
  190. {
  191. var query = (from timesheet in db.Timesheets
  192. where timesheet.Entries.Any(e => e.Comments.Contains("testing"))
  193. select timesheet).ToList();
  194. Assert.AreEqual(2, query.Count);
  195. }
  196. [Test]
  197. public void TimeSheetsWithStringContainsSubQueryWithAsQueryable()
  198. {
  199. //NH-2998
  200. var query = (from timesheet in db.Timesheets
  201. where timesheet.Entries.AsQueryable().Any(e => e.Comments.Contains("testing"))
  202. select timesheet).ToList();
  203. Assert.AreEqual(2, query.Count);
  204. }
  205. [Test]
  206. public void TimeSheetsWithStringContainsSubQueryWithAsQueryableAndExternalPredicate()
  207. {
  208. //NH-2998
  209. Expression<Func<TimesheetEntry, bool>> predicate = e => e.Comments.Contains("testing");
  210. var query = (from timesheet in db.Timesheets
  211. where timesheet.Entries.AsQueryable().Any(predicate)
  212. select timesheet).ToList();
  213. Assert.AreEqual(2, query.Count);
  214. }
  215. [Test]
  216. public void CategoriesSubQueryWithAsQueryableAndExternalPredicateWithClosure()
  217. {
  218. //NH-2998
  219. var ids = new[] { 1 };
  220. var quantities = new[] { 100 };
  221. Expression<Func<OrderLine, bool>> predicate2 = e => quantities.Contains(e.Quantity);
  222. Expression<Func<Product, bool>> predicate1 = e => !ids.Contains(e.ProductId)
  223. && e.OrderLines.AsQueryable().Any(predicate2);
  224. var query = (from category in db.Categories
  225. where category.Products.AsQueryable().Any(predicate1)
  226. select category).ToList();
  227. Assert.AreEqual(6, query.Count);
  228. }
  229. [Test]
  230. public void TimeSheetsSubQueryWithAsQueryableAndExternalPredicateWithSecondLevelClosure()
  231. {
  232. //NH-2998
  233. var ids = new[] { 1 };
  234. Expression<Func<TimesheetEntry, bool>> predicate = e => !ids.Contains(e.Id);
  235. var query = (from timesheet in db.Timesheets
  236. where timesheet.Entries.AsQueryable().Any(predicate)
  237. select timesheet).ToList();
  238. Assert.AreEqual(2, query.Count);
  239. }
  240. [Test]
  241. public void TimeSheetsSubQueryWithAsQueryableAndExternalPredicateWithArray()
  242. {
  243. //NH-2998
  244. Expression<Func<TimesheetEntry, bool>> predicate = e => !new[] { 1 }.Contains(e.Id);
  245. var query = (from timesheet in db.Timesheets
  246. where timesheet.Entries.AsQueryable().Any(predicate)
  247. select timesheet).ToList();
  248. Assert.AreEqual(2, query.Count);
  249. }
  250. [Test]
  251. public void TimeSheetsSubQueryWithAsQueryableWithArray()
  252. {
  253. //NH-2998
  254. var query = (from timesheet in db.Timesheets
  255. where timesheet.Entries.AsQueryable().Any(e => !new[] { 1 }.Contains(e.Id))
  256. select timesheet).ToList();
  257. Assert.AreEqual(2, query.Count);
  258. }
  259. [Test]
  260. public void HqlOrderLinesWithInnerJoinAndSubQuery()
  261. {
  262. //NH-3002
  263. var lines = session.CreateQuery(@"select c from OrderLine c
  264. join c.Order o
  265. where o.Customer.CustomerId = 'VINET'
  266. and not exists (from c.Order.Employee.Subordinates x where x.EmployeeId = 100)
  267. ").List<OrderLine>();
  268. Assert.AreEqual(10, lines.Count);
  269. }
  270. [Test]
  271. public void HqlOrderLinesWithImpliedJoinAndSubQuery()
  272. {
  273. //NH-3002
  274. var lines = session.CreateQuery(@"from OrderLine c
  275. where c.Order.Customer.CustomerId = 'VINET'
  276. and not exists (from c.Order.Employee.Subordinates x where x.EmployeeId = 100)
  277. ").List<OrderLine>();
  278. Assert.AreEqual(10, lines.Count);
  279. }
  280. [Test]
  281. public void OrderLinesWithImpliedJoinAndSubQuery()
  282. {
  283. //NH-2999 and NH-2988
  284. var lines = (from l in db.OrderLines
  285. where l.Order.Customer.CustomerId == "VINET"
  286. where !l.Order.Employee.Subordinates.Any(x => x.EmployeeId == 100)
  287. select l).ToList();
  288. Assert.AreEqual(10, lines.Count);
  289. }
  290. [Test]
  291. public void OrdersWithSubquery1()
  292. {
  293. //NH-2904
  294. var query = (from order in db.Orders
  295. where order.OrderLines.Any()
  296. select order).ToList();
  297. Assert.AreEqual(830, query.Count);
  298. }
  299. [Test]
  300. public void OrdersWithSubquery2()
  301. {
  302. //NH-2904
  303. var subquery = from line in db.OrderLines
  304. select line.Order;
  305. var query = (from order in db.Orders
  306. where subquery.Contains(order)
  307. select order).ToList();
  308. Assert.AreEqual(830, query.Count);
  309. }
  310. [Test]
  311. public void OrdersWithSubquery3()
  312. {
  313. //NH-2904
  314. var subquery = from line in db.OrderLines
  315. select line.Order.OrderId;
  316. var query = (from order in db.Orders
  317. where subquery.Contains(order.OrderId)
  318. select order).ToList();
  319. Assert.AreEqual(830, query.Count);
  320. }
  321. [Test]
  322. public void OrdersWithSubquery4()
  323. {
  324. //NH-2904
  325. var subquery = from line in db.OrderLines
  326. select line.Order;
  327. var query = (from order in db.Orders
  328. where subquery.Any(x => x.OrderId == order.OrderId)
  329. select order).ToList();
  330. Assert.AreEqual(830, query.Count);
  331. }
  332. [Test]
  333. public void OrdersWithSubquery5()
  334. {
  335. //NH-2904
  336. var query = (from order in db.Orders
  337. where order.OrderLines.Any(x => x.Quantity == 5)
  338. select order).ToList();
  339. Assert.AreEqual(61, query.Count);
  340. }
  341. [Test]
  342. public void OrdersWithSubquery6()
  343. {
  344. //NH-2904
  345. var subquery = from line in db.OrderLines
  346. where line.Quantity == 5
  347. select line.Order;
  348. var query = (from order in db.Orders
  349. where subquery.Contains(order)
  350. select order).ToList();
  351. Assert.AreEqual(61, query.Count);
  352. }
  353. [Test]
  354. public void OrdersWithSubquery7()
  355. {
  356. //NH-2904
  357. var subquery = from line in db.OrderLines
  358. where line.Quantity == 5
  359. select line.Order.OrderId;
  360. var query = (from order in db.Orders
  361. where subquery.Contains(order.OrderId)
  362. select order).ToList();
  363. Assert.AreEqual(61, query.Count);
  364. }
  365. [Test]
  366. public void OrdersWithSubquery8()
  367. {
  368. //NH-2904
  369. var subquery = from line in db.OrderLines
  370. where line.Quantity == 5
  371. select line.Order;
  372. var query = (from order in db.Orders
  373. where subquery.Any(x => x.OrderId == order.OrderId)
  374. select order).ToList();
  375. Assert.AreEqual(61, query.Count);
  376. }
  377. [Test]
  378. public void OrdersWithSubqueryWithJoin()
  379. {
  380. //NH-3147
  381. var subquery = from line in db.OrderLines
  382. join product in db.Products
  383. on line.Product.ProductId equals product.ProductId
  384. where line.Quantity == 5
  385. select line.Order;
  386. var query = (from order in db.Orders
  387. where subquery.Contains(order)
  388. select order).ToList();
  389. Assert.AreEqual(61, query.Count);
  390. }
  391. [Test]
  392. public void ProductsWithSubquery()
  393. {
  394. //NH-2899
  395. var result = (from p in db.Products
  396. where (from c in db.Categories
  397. where c.Name == "Confections"
  398. select c).Contains(p.Category)
  399. select p)
  400. .ToList();
  401. Assert.That(result.Count, Is.EqualTo(13));
  402. }
  403. [Test]
  404. public void SubqueryWhereFailingTest()
  405. {
  406. //NH-3111
  407. var list = (db.OrderLines
  408. .Select(ol => new
  409. {
  410. ol.Discount,
  411. ShipperPhoneNumber = db.Shippers
  412. .Where(sh => sh.ShipperId == ol.Order.Shipper.ShipperId)
  413. .Select(sh => sh.PhoneNumber)
  414. .FirstOrDefault()
  415. })).ToList();
  416. Assert.That(list.Count, Is.EqualTo(2155));
  417. }
  418. [Test]
  419. public void SubqueryWhereFailingTest2()
  420. {
  421. //NH-3111
  422. var list = db.OrderLines
  423. .Select(ol => new
  424. {
  425. ol.Discount,
  426. ShipperPhoneNumber = db.Shippers
  427. .Where(sh => sh == ol.Order.Shipper)
  428. .Select(sh => sh.PhoneNumber)
  429. .FirstOrDefault()
  430. }).ToList();
  431. Assert.That(list.Count, Is.EqualTo(2155));
  432. }
  433. [Test]
  434. public void SubqueryWhereFailingTest3()
  435. {
  436. //NH-3111
  437. var list = db.OrderLines
  438. .Select(ol => new
  439. {
  440. ol.Discount,
  441. ShipperPhoneNumber = db.Orders
  442. .Where(sh => sh.Shipper.ShipperId == ol.Order.Shipper.ShipperId)
  443. .Select(sh => sh.Shipper.PhoneNumber)
  444. .FirstOrDefault()
  445. }).ToList();
  446. Assert.That(list.Count, Is.EqualTo(2155));
  447. }
  448. }
  449. }