PageRenderTime 51ms CodeModel.GetById 5ms RepoModel.GetById 1ms app.codeStats 0ms

/src/NHibernate.Test/Linq/SelectionTests.cs

https://github.com/okb/nhibernate-core
C# | 357 lines | 285 code | 56 blank | 16 comment | 42 complexity | af355a04cacf4b9e25b943c426928ca9 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 Iesi.Collections.Generic;
  5. using NHibernate.DomainModel.Northwind.Entities;
  6. using NUnit.Framework;
  7. namespace NHibernate.Test.Linq
  8. {
  9. [TestFixture]
  10. public class SelectionTests : LinqTestCase
  11. {
  12. [Test]
  13. public void CanGetCountOnQueryWithAnonymousType()
  14. {
  15. var query = from user in db.Users
  16. select new { user.Name, RoleName = user.Role.Name };
  17. int totalCount = query.Count();
  18. Assert.AreEqual(3, totalCount);
  19. }
  20. [Test]
  21. public void CanGetFirstWithAnonymousType()
  22. {
  23. var query = from user in db.Users
  24. select new { user.Name, RoleName = user.Role.Name };
  25. var firstUser = query.First();
  26. Assert.IsNotNull(firstUser);
  27. }
  28. [Test]
  29. public void CanAggregateWithAnonymousType()
  30. {
  31. var query = from user in db.Users
  32. select new { user.Name, RoleName = user.Role.Name };
  33. var userInfo = query.Aggregate((u1, u2) => u1);
  34. Assert.IsNotNull(userInfo);
  35. }
  36. [Test]
  37. public void CanSelectUsingMemberInitExpression()
  38. {
  39. var query = from user in db.Users
  40. select new UserDto(user.Id, user.Name) { InvalidLoginAttempts = user.InvalidLoginAttempts };
  41. var list = query.ToList();
  42. Assert.AreEqual(3, list.Count);
  43. }
  44. [Test]
  45. public void CanSelectNestedAnonymousType()
  46. {
  47. var query = from user in db.Users
  48. select new
  49. {
  50. user.Name,
  51. Enums = new
  52. {
  53. user.Enum1,
  54. user.Enum2
  55. },
  56. RoleName = user.Role.Name
  57. };
  58. var list = query.ToList();
  59. Assert.AreEqual(3, list.Count);
  60. //assert role names -- to ensure that the correct values were used to invoke constructor
  61. Assert.IsTrue(list.All(u => u.RoleName == "Admin" || u.RoleName == "User" || String.IsNullOrEmpty(u.RoleName)));
  62. }
  63. [Test]
  64. public void CanSelectNestedAnonymousTypeWithMultipleReferences()
  65. {
  66. var query = from user in db.Users
  67. select new
  68. {
  69. user.Name,
  70. Enums = new
  71. {
  72. user.Enum1,
  73. user.Enum2
  74. },
  75. RoleName = user.Role.Name,
  76. RoleIsActive = (bool?) user.Role.IsActive
  77. };
  78. var list = query.ToList();
  79. Assert.AreEqual(3, list.Count);
  80. //assert role names -- to ensure that the correct values were used to invoke constructor
  81. Assert.IsTrue(list.All(u => u.RoleName == "Admin" || u.RoleName == "User" || String.IsNullOrEmpty(u.RoleName)));
  82. }
  83. [Test]
  84. public void CanSelectNestedAnonymousTypeWithComponentReference()
  85. {
  86. var query = from user in db.Users
  87. select new
  88. {
  89. user.Name,
  90. Enums = new
  91. {
  92. user.Enum1,
  93. user.Enum2
  94. },
  95. RoleName = user.Role.Name,
  96. ComponentProperty = user.Component.Property1
  97. };
  98. var list = query.ToList();
  99. Assert.AreEqual(3, list.Count);
  100. //assert role names -- to ensure that the correct values were used to invoke constructor
  101. Assert.IsTrue(list.All(u => u.RoleName == "Admin" || u.RoleName == "User" || String.IsNullOrEmpty(u.RoleName)));
  102. }
  103. [Test]
  104. public void CanSelectNestedMemberInitExpression()
  105. {
  106. var query = from user in db.Users
  107. select new UserDto(user.Id, user.Name)
  108. {
  109. InvalidLoginAttempts = user.InvalidLoginAttempts,
  110. Dto2 = new UserDto2
  111. {
  112. RegisteredAt = user.RegisteredAt,
  113. Enum = user.Enum2
  114. },
  115. RoleName = user.Role.Name
  116. };
  117. var list = query.ToList();
  118. Assert.AreEqual(3, list.Count);
  119. //assert role names -- to ensure that the correct values were used to invoke constructor
  120. Assert.IsTrue(list.All(u => u.RoleName == "Admin" || u.RoleName == "User" || String.IsNullOrEmpty(u.RoleName)));
  121. }
  122. [Test]
  123. public void CanSelectNestedMemberInitWithinNewExpression()
  124. {
  125. var query = from user in db.Users
  126. select new
  127. {
  128. user.Name,
  129. user.InvalidLoginAttempts,
  130. Dto = new UserDto2
  131. {
  132. RegisteredAt = user.RegisteredAt,
  133. Enum = user.Enum2
  134. },
  135. RoleName = user.Role.Name
  136. };
  137. var list = query.ToList();
  138. Assert.AreEqual(3, list.Count);
  139. //assert role names -- to ensure that the correct values were used to invoke constructor
  140. Assert.IsTrue(list.All(u => u.RoleName == "Admin" || u.RoleName == "User" || String.IsNullOrEmpty(u.RoleName)));
  141. }
  142. [Test]
  143. public void CanSelectSingleProperty()
  144. {
  145. var query = from user in db.Users
  146. where user.Name == "ayende"
  147. select user.RegisteredAt;
  148. DateTime date = query.Single();
  149. Assert.AreEqual(new DateTime(2010, 06, 17), date);
  150. }
  151. [Test]
  152. public void CanSelectWithProxyInterface()
  153. {
  154. var query = (from user in db.IUsers
  155. where user.Name == "ayende"
  156. select user).ToArray();
  157. Assert.AreEqual(1, query.Length);
  158. Assert.AreEqual("ayende", query.First().Name);
  159. }
  160. [Test]
  161. public void CanSelectBinaryExpressions()
  162. {
  163. var query = from user in db.Users
  164. select new
  165. {
  166. user.Name,
  167. IsSmall = (user.Enum1 == EnumStoredAsString.Small)
  168. };
  169. var list = query.ToList();
  170. foreach (var user in list)
  171. {
  172. if (user.Name == "rahien")
  173. {
  174. Assert.IsTrue(user.IsSmall);
  175. }
  176. else
  177. {
  178. Assert.IsFalse(user.IsSmall);
  179. }
  180. }
  181. }
  182. [Test]
  183. public void CanSelectWithMultipleBinaryExpressions()
  184. {
  185. var query = from user in db.Users
  186. select new
  187. {
  188. user.Name,
  189. IsAyende = (user.Enum1 == EnumStoredAsString.Medium
  190. && user.Enum2 == EnumStoredAsInt32.High)
  191. };
  192. var list = query.ToList();
  193. foreach (var user in list)
  194. {
  195. if (user.Name == "ayende")
  196. {
  197. Assert.IsTrue(user.IsAyende);
  198. }
  199. else
  200. {
  201. Assert.IsFalse(user.IsAyende);
  202. }
  203. }
  204. }
  205. [Test]
  206. public void CanSelectWithMultipleBinaryExpressionsWithOr()
  207. {
  208. var query = from user in db.Users
  209. select new
  210. {
  211. user.Name,
  212. IsAyende = (user.Name == "ayende"
  213. || user.Name == "rahien")
  214. };
  215. var list = query.ToList();
  216. foreach (var user in list)
  217. {
  218. if (user.Name == "ayende" || user.Name == "rahien")
  219. {
  220. Assert.IsTrue(user.IsAyende);
  221. }
  222. else
  223. {
  224. Assert.IsFalse(user.IsAyende);
  225. }
  226. }
  227. }
  228. [Test]
  229. public void CanSelectWithAnySubQuery()
  230. {
  231. var query = from timesheet in db.Timesheets
  232. select new
  233. {
  234. timesheet.Id,
  235. HasEntries = timesheet.Entries.Any()
  236. };
  237. var list = query.ToList();
  238. Assert.AreEqual(2, list.Count(t => t.HasEntries));
  239. Assert.AreEqual(1, list.Count(t => !t.HasEntries));
  240. }
  241. [Test]
  242. public void CanSelectWithAggregateSubQuery()
  243. {
  244. var timesheets = (from timesheet in db.Timesheets
  245. select new
  246. {
  247. timesheet.Id,
  248. EntryCount = timesheet.Entries.Count
  249. }).ToArray();
  250. Assert.AreEqual(3, timesheets.Length);
  251. Assert.AreEqual(0, timesheets[0].EntryCount);
  252. Assert.AreEqual(2, timesheets[1].EntryCount);
  253. Assert.AreEqual(4, timesheets[2].EntryCount);
  254. }
  255. [Test]
  256. public void CanProjectWithCast()
  257. {
  258. // NH-2463
  259. // ReSharper disable RedundantCast
  260. var names1 = db.Users.Select(p => new { p1 = p.Name }).ToList();
  261. Assert.AreEqual(3, names1.Count);
  262. var names2 = db.Users.Select(p => new { p1 = ((User) p).Name }).ToList();
  263. Assert.AreEqual(3, names2.Count);
  264. var names3 = db.Users.Select(p => new { p1 = (p as User).Name }).ToList();
  265. Assert.AreEqual(3, names3.Count);
  266. var names4 = db.Users.Select(p => new { p1 = ((IUser) p).Name }).ToList();
  267. Assert.AreEqual(3, names4.Count);
  268. var names5 = db.Users.Select(p => new { p1 = (p as IUser).Name }).ToList();
  269. Assert.AreEqual(3, names5.Count);
  270. // ReSharper restore RedundantCast
  271. }
  272. [Test]
  273. public void CanSelectAfterOrderByAndTake()
  274. {
  275. // NH-3320
  276. var names = db.Users.OrderBy(p => p.Name).Take(3).Select(p => p.Name).ToList();
  277. Assert.AreEqual(3, names.Count);
  278. }
  279. [Test]
  280. public void CanSelectManyWithCast()
  281. {
  282. // NH-2688
  283. // ReSharper disable RedundantCast
  284. var orders1 = db.Customers.Where(c => c.CustomerId == "VINET").SelectMany(o => o.Orders).ToList();
  285. Assert.AreEqual(5, orders1.Count);
  286. //$exception {"c.Orders is not mapped [.SelectMany[NHibernate.DomainModel.Northwind.Entities.Customer,NHibernate.DomainModel.Northwind.Entities.Order](.Where[NHibernate.DomainModel.Northwind.Entities.Customer](NHibernate.Linq.NhQueryable`1[NHibernate.DomainModel.Northwind.Entities.Customer], Quote((c, ) => (String.op_Equality(c.CustomerId, p1))), ), Quote((o, ) => (Convert(o.Orders))), )]"} System.Exception {NHibernate.Hql.Ast.ANTLR.QuerySyntaxException}
  287. // Block OData navigation to detail request requests like
  288. // http://localhost:2711/TestWcfDataService.svc/TestEntities(guid'0dd52f6c-1943-4013-a88e-3b63a1fbe11b')/Details1
  289. var orders2 = db.Customers.Where(c => c.CustomerId == "VINET").SelectMany(o => (ISet<Order>) o.Orders).ToList();
  290. Assert.AreEqual(5, orders2.Count);
  291. //$exception {"([100001].Orders As ISet`1)"} System.Exception {System.NotSupportedException}
  292. var orders3 = db.Customers.Where(c => c.CustomerId == "VINET").SelectMany(o => (o.Orders as ISet<Order>)).ToList();
  293. Assert.AreEqual(5, orders3.Count);
  294. var orders4 = db.Customers.Where(c => c.CustomerId == "VINET").SelectMany(o => (IEnumerable<Order>) o.Orders).ToList();
  295. Assert.AreEqual(5, orders4.Count);
  296. var orders5 = db.Customers.Where(c => c.CustomerId == "VINET").SelectMany(o => (o.Orders as IEnumerable<Order>)).ToList();
  297. Assert.AreEqual(5, orders5.Count);
  298. // ReSharper restore RedundantCast
  299. }
  300. }
  301. }