Query_Test.cs 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454
  1. using Microsoft.VisualStudio.TestTools.UnitTesting;
  2. using Vit.Extensions.Vitorm_Extensions;
  3. using System.Data;
  4. namespace Vitorm.MsTest.CommonTest
  5. {
  6. [TestClass]
  7. public class Query_Test
  8. {
  9. [TestMethod]
  10. public void Test_Get()
  11. {
  12. {
  13. using var dbContext = DataSource.CreateDbContext();
  14. var user = dbContext.Get<User>(3);
  15. Assert.AreEqual(3, user?.id);
  16. }
  17. {
  18. using var dbContext = DataSource.CreateDbContext();
  19. var user = dbContext.DbSet<User>().Get(5);
  20. Assert.AreEqual(5, user?.id);
  21. }
  22. }
  23. [TestMethod]
  24. public void Test_PlainQuery()
  25. {
  26. using var dbContext = DataSource.CreateDbContext();
  27. var userQuery = dbContext.Query<User>();
  28. {
  29. var userList = userQuery.ToList();
  30. Assert.AreEqual(6, userList.Count);
  31. Assert.AreEqual(1, userList.First().id);
  32. Assert.AreEqual(6, userList.Last().id);
  33. }
  34. {
  35. var userList = userQuery.Select(u => u.id).ToList();
  36. Assert.AreEqual(6, userList.Count);
  37. Assert.AreEqual(1, userList.First());
  38. Assert.AreEqual(6, userList.Last());
  39. }
  40. }
  41. [TestMethod]
  42. public void Test_Where()
  43. {
  44. using var dbContext = DataSource.CreateDbContext();
  45. var userQuery = dbContext.Query<User>();
  46. {
  47. var userList = userQuery.Where(u => u.id > 2).Where(m => m.id < 4).ToList();
  48. Assert.AreEqual(1, userList.Count);
  49. Assert.AreEqual(3, userList.First().id);
  50. }
  51. {
  52. var userList = userQuery.Where(u => u.id == 3).Where(m => m.fatherId == 5).ToList();
  53. Assert.AreEqual(3, userList.First().id);
  54. }
  55. {
  56. var userList = userQuery.Where(u => u.id + 1 == 4).Where(m => m.fatherId == 5).ToList();
  57. Assert.AreEqual(3, userList.First().id);
  58. }
  59. {
  60. var userList = userQuery.Where(u => 4 == u.id + 1).Where(m => m.fatherId == 5).ToList();
  61. Assert.AreEqual(3, userList.First().id);
  62. }
  63. {
  64. var userList = userQuery.Where(u => u.birth == new DateTime(2021, 01, 01, 03, 00, 00)).ToList();
  65. Assert.AreEqual(1, userList.Count);
  66. Assert.AreEqual(3, userList.First().id);
  67. }
  68. {
  69. var userList = userQuery.Where(u => u.birth == DateTime.Parse("2021-01-01 01:00:00").AddHours(2)).ToList();
  70. Assert.AreEqual(1, userList.Count);
  71. Assert.AreEqual(3, userList.First().id);
  72. }
  73. }
  74. [TestMethod]
  75. public void Test_Select()
  76. {
  77. using var dbContext = DataSource.CreateDbContext();
  78. var userQuery = dbContext.Query<User>();
  79. {
  80. var userList = userQuery.Select(u => u).Where(user => user.id > 2).Where(user => user.id < 4).Select(u => u).ToList();
  81. Assert.AreEqual(1, userList.Count);
  82. Assert.AreEqual(3, userList.First().id);
  83. }
  84. {
  85. var query =
  86. from user in userQuery
  87. select new
  88. {
  89. uniqueId1 = user.id + "_" + user.fatherId + "_" + user.motherId,
  90. uniqueId2 = $"{user.id}_{user.fatherId}_{user.motherId}"
  91. };
  92. var userList = query.ToList();
  93. Assert.AreEqual(6, userList.Count);
  94. Assert.AreEqual("1_4_6", userList.First().uniqueId1);
  95. }
  96. }
  97. [TestMethod]
  98. public void Test_Count()
  99. {
  100. using var dbContext = DataSource.CreateDbContext();
  101. var userQuery = dbContext.Query<User>();
  102. {
  103. var count = (from user in userQuery
  104. from father in userQuery.Where(father => user.fatherId == father.id).DefaultIfEmpty()
  105. where user.id > 2 && father == null
  106. select new
  107. {
  108. father
  109. }).Count();
  110. Assert.AreEqual(3, count);
  111. }
  112. }
  113. [TestMethod]
  114. public void Test_AllFeatures()
  115. {
  116. using var dbContext = DataSource.CreateDbContext();
  117. var userQuery = dbContext.Query<User>();
  118. #region SelectMany().Where().OrderBy().Skip().Take().ToExecuteString()
  119. /*
  120. users.SelectMany(
  121. user => users.Where(father => user.fatherId == father.id).DefaultIfEmpty()
  122. , (user, father) => new {user = user, father = father}
  123. ).Where(row => row.user.id > 2)
  124. .Select(row => new {row.user })
  125. .OrderBy(user=>user.id)
  126. .Skip(1).Take(2);
  127. */
  128. {
  129. var query = (from user in userQuery
  130. from father in userQuery.Where(father => user.fatherId == father.id).DefaultIfEmpty()
  131. where user.id > 2
  132. orderby father.id, user.id descending
  133. select new
  134. {
  135. user
  136. })
  137. .Skip(1).Take(2);
  138. var sql = query.ToExecuteString();
  139. var list = query.ToList();
  140. Assert.AreEqual(2, list.Count);
  141. Assert.AreEqual(5, list[0].user.id);
  142. Assert.AreEqual(4, list[1].user.id);
  143. }
  144. #endregion
  145. }
  146. [TestMethod]
  147. public void Test_FirstOrDefault()
  148. {
  149. using var dbContext = DataSource.CreateDbContext();
  150. var userQuery = dbContext.Query<User>();
  151. {
  152. var user = userQuery.FirstOrDefault();
  153. Assert.AreEqual(1, user?.id);
  154. }
  155. {
  156. var user = userQuery.FirstOrDefault(user => user.id == 3);
  157. Assert.AreEqual(3, user?.id);
  158. }
  159. {
  160. var user = userQuery.FirstOrDefault(user => user.id == 13);
  161. Assert.AreEqual(null, user?.id);
  162. }
  163. {
  164. var user = userQuery.OrderByDescending(m => m.id).FirstOrDefault();
  165. Assert.AreEqual(6, user?.id);
  166. }
  167. }
  168. [TestMethod]
  169. public void Test_First()
  170. {
  171. using var dbContext = DataSource.CreateDbContext();
  172. var userQuery = dbContext.Query<User>();
  173. {
  174. var user = userQuery.First();
  175. Assert.AreEqual(1, user?.id);
  176. }
  177. {
  178. var user = userQuery.First(user => user.id == 3);
  179. Assert.AreEqual(3, user?.id);
  180. }
  181. {
  182. try
  183. {
  184. var user = userQuery.First(user => user.id == 13);
  185. Assert.Fail("IQueryalbe.First should throw Exception");
  186. }
  187. catch (Exception ex)
  188. {
  189. }
  190. }
  191. }
  192. [TestMethod]
  193. public void Test_LastOrDefault()
  194. {
  195. using var dbContext = DataSource.CreateDbContext();
  196. var userQuery = dbContext.Query<User>();
  197. {
  198. var id = userQuery.Select(u => u.id).FirstOrDefault();
  199. Assert.AreEqual(1, id);
  200. }
  201. {
  202. var user = userQuery.LastOrDefault();
  203. Assert.AreEqual(6, user?.id);
  204. }
  205. {
  206. var user = userQuery.LastOrDefault(user => user.id == 3);
  207. Assert.AreEqual(3, user?.id);
  208. }
  209. {
  210. var user = userQuery.LastOrDefault(user => user.id == 13);
  211. Assert.AreEqual(null, user?.id);
  212. }
  213. {
  214. var user = userQuery.OrderByDescending(m => m.id).LastOrDefault();
  215. Assert.AreEqual(1, user?.id);
  216. }
  217. }
  218. [TestMethod]
  219. public void Test_Last()
  220. {
  221. using var dbContext = DataSource.CreateDbContext();
  222. var userQuery = dbContext.Query<User>();
  223. {
  224. var user = userQuery.Last();
  225. Assert.AreEqual(6, user?.id);
  226. }
  227. {
  228. var user = userQuery.Last(user => user.id == 3);
  229. Assert.AreEqual(3, user?.id);
  230. }
  231. {
  232. try
  233. {
  234. var user = userQuery.Last(user => user.id == 13);
  235. Assert.Fail("IQueryalbe.First should throw Exception");
  236. }
  237. catch (Exception ex)
  238. {
  239. }
  240. }
  241. }
  242. // Enumerable.ToArray
  243. [TestMethod]
  244. public void Test_Enumerable_ToArray()
  245. {
  246. using var dbContext = DataSource.CreateDbContext();
  247. var userQuery = dbContext.Query<User>();
  248. {
  249. var userList = userQuery.ToArray();
  250. Assert.AreEqual(6, userList.Length);
  251. Assert.AreEqual(1, userList.First().id);
  252. Assert.AreEqual(6, userList.Last().id);
  253. }
  254. {
  255. var userList = userQuery.Select(u => u.id).ToArray();
  256. Assert.AreEqual(6, userList.Length);
  257. Assert.AreEqual(1, userList.First());
  258. Assert.AreEqual(6, userList.Last());
  259. }
  260. }
  261. // Enumerable.Contains
  262. // Queryable.Contains
  263. [TestMethod]
  264. public void Test_Contains()
  265. {
  266. using var dbContext = DataSource.CreateDbContext();
  267. var userQuery = dbContext.Query<User>();
  268. // string in
  269. {
  270. var userList = userQuery.Where(u => new[] { "u3", "u5" }.Contains(u.name)).ToList();
  271. Assert.AreEqual(2, userList.Count);
  272. Assert.AreEqual(3, userList.First().id);
  273. Assert.AreEqual(5, userList.Last().id);
  274. }
  275. // string not in
  276. {
  277. var userList = userQuery.Where(u => !new[] { "u3", "u5" }.Contains(u.name)).ToList();
  278. Assert.AreEqual(4, userList.Count);
  279. Assert.AreEqual(1, userList.First().id);
  280. Assert.AreEqual(4, userList[2].id);
  281. }
  282. // numeric in
  283. {
  284. var userList = userQuery.Where(u => new[] { 3, 5 }.Contains(u.id)).ToList();
  285. Assert.AreEqual(2, userList.Count);
  286. Assert.AreEqual(3, userList.First().id);
  287. Assert.AreEqual(5, userList.Last().id);
  288. }
  289. {
  290. var ids = new[] { 3, 5 }.AsEnumerable();
  291. var userList = userQuery.Where(u => ids.Contains(u.id)).ToList();
  292. Assert.AreEqual(2, userList.Count);
  293. Assert.AreEqual(3, userList.First().id);
  294. Assert.AreEqual(5, userList.Last().id);
  295. }
  296. {
  297. var ids = new[] { 3, 5 }.AsQueryable();
  298. var userList = userQuery.Where(u => ids.Contains(u.id)).ToList();
  299. Assert.AreEqual(2, userList.Count);
  300. Assert.AreEqual(3, userList.First().id);
  301. Assert.AreEqual(5, userList.Last().id);
  302. }
  303. }
  304. [TestMethod]
  305. public void Test_StringMethods()
  306. {
  307. using var dbContext = DataSource.CreateDbContext();
  308. var userQuery = dbContext.Query<User>();
  309. userQuery.ExecuteUpdate(row => new User
  310. {
  311. name = "u|" + row.id + "|" + (row.fatherId.ToString() ?? "") + "|" + (row.motherId.ToString() ?? "")
  312. });
  313. // StartsWith
  314. {
  315. var query = userQuery.Where(u => u.name.StartsWith("u|3|5"));
  316. var sql = query.ToExecuteString();
  317. var userList = query.ToList();
  318. Assert.AreEqual(1, userList.Count);
  319. Assert.AreEqual(3, userList.First().id);
  320. Assert.AreEqual("u|3|5|6", userList.First().name);
  321. }
  322. // EndsWith
  323. {
  324. var query = userQuery.Where(u => u.name.EndsWith("3|5|6"));
  325. var sql = query.ToExecuteString();
  326. var userList = query.ToList();
  327. Assert.AreEqual(1, userList.Count);
  328. Assert.AreEqual(3, userList.First().id);
  329. Assert.AreEqual("u|3|5|6", userList.First().name);
  330. }
  331. // Contains
  332. {
  333. var query = userQuery.Where(u => u.name.Contains("|3|5|"));
  334. var sql = query.ToExecuteString();
  335. var userList = query.ToList();
  336. Assert.AreEqual(1, userList.Count);
  337. Assert.AreEqual(3, userList.First().id);
  338. Assert.AreEqual("u|3|5|6", userList.First().name);
  339. }
  340. }
  341. [TestMethod]
  342. public void Test_Distinct()
  343. {
  344. using var dbContext = DataSource.CreateDbContext();
  345. var userQuery = dbContext.Query<User>();
  346. {
  347. var query = userQuery.Select(u => new { u.fatherId }).Distinct();
  348. var sql = query.ToExecuteString();
  349. var userList = query.ToList();
  350. var ids = userList.Select(u => u.fatherId).ToList();
  351. Assert.AreEqual(3, ids.Count);
  352. Assert.AreEqual(0, ids.Except(new int?[] { 4, 5, null }).Count());
  353. }
  354. {
  355. var query = userQuery.Select(u => u.fatherId).Distinct();
  356. var sql = query.ToExecuteString();
  357. var ids = query.ToList();
  358. Assert.AreEqual(3, ids.Count);
  359. Assert.AreEqual(0, ids.Except(new int?[] { 4, 5, null }).Count());
  360. }
  361. {
  362. var query = userQuery.Distinct();
  363. var sql = query.ToExecuteString();
  364. var userList = query.ToList();
  365. Assert.AreEqual(6, userList.Count);
  366. }
  367. }
  368. }
  369. }