Queryable_QueryBuilder_Test.cs 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481
  1. using System.Linq;
  2. using Microsoft.VisualStudio.TestTools.UnitTesting;
  3. using Vit.Core.Module.Serialization;
  4. using Vit.Linq.QueryBuilder;
  5. using Vit.Extensions.Linq_Extensions;
  6. namespace Vit.Linq.MsTest.QueryBuilder
  7. {
  8. [TestClass]
  9. public class Queryable_QueryBuilder_Test
  10. {
  11. IQueryable<ModelA> GetQueryable() => DataSource.GetQueryable();
  12. [TestMethod]
  13. public void Test_ToList()
  14. {
  15. var query = GetQueryable();
  16. #region Count ToList ToArray
  17. {
  18. int count = query.Count();
  19. Assert.AreEqual(1000, count);
  20. var list1 = query.ToList<ModelA>();
  21. Assert.AreEqual(1000, list1.Count);
  22. var list2 = query.ToList();
  23. Assert.AreEqual(1000, list2.Count);
  24. var array1 = query.ToArray<ModelA>();
  25. Assert.AreEqual(1000, array1.Length);
  26. var array2 = query.ToArray();
  27. Assert.AreEqual(1000, array2.Length);
  28. }
  29. #endregion
  30. }
  31. [TestMethod]
  32. public void Test_OperatorMap()
  33. {
  34. {
  35. var query = GetQueryable();
  36. QueryBuilderService.Instance.AddOperatorMap("Equal", FilterRuleOperator.Equal);
  37. var strRule = "{'field':'isEven', 'operator': 'eQual', 'value':true }".Replace("'", "\"");
  38. var rule = Json.Deserialize<FilterRule>(strRule);
  39. var result = query.Where(rule).ToList();
  40. Assert.AreEqual(result.Count, 500);
  41. Assert.AreEqual(0, result[0].id);
  42. }
  43. }
  44. #region Test_FilterRule
  45. [TestMethod]
  46. public void Test_FilterRule()
  47. {
  48. #region #1 [object] IsNull | IsNotNull
  49. #region ##1 IsNull
  50. {
  51. var query = GetQueryable();
  52. var item = query.Skip(10).FirstOrDefault();
  53. item.name = null;
  54. var strRule = "{'field':'name', 'operator': 'IsNull' }".Replace("'", "\"");
  55. var rule = Json.Deserialize<FilterRule>(strRule);
  56. var result = query.Where(rule).ToList();
  57. Assert.AreEqual(1, result.Count);
  58. Assert.AreEqual(10, result[0].id);
  59. }
  60. #endregion
  61. #region ##2 IsNotNull
  62. {
  63. var query = GetQueryable();
  64. var item = query.Skip(10).FirstOrDefault();
  65. item.name = null;
  66. var strRule = "{'field':'name', 'operator': 'IsNotNull' }".Replace("'", "\"");
  67. var rule = Json.Deserialize<FilterRule>(strRule);
  68. var result = query.Where(rule).ToList();
  69. Assert.AreEqual(999, result.Count);
  70. }
  71. #endregion
  72. #endregion
  73. #region #2 [number | string | bool] compare
  74. #region ##1.1 [number] =
  75. {
  76. // ###1
  77. {
  78. var query = GetQueryable();
  79. var strRule = "{'field':'id', 'operator': '=', 'value':10 }".Replace("'", "\"");
  80. var rule = Json.Deserialize<FilterRule>(strRule);
  81. var result = query.Where(rule).ToList();
  82. Assert.AreEqual(1, result.Count);
  83. Assert.AreEqual(10, result[0].id);
  84. }
  85. // ###2
  86. {
  87. var query = GetQueryable();
  88. var strRule = "{'field':'id', 'operator': '=', 'value': '10' }".Replace("'", "\"");
  89. var rule = Json.Deserialize<FilterRule>(strRule);
  90. var result = query.Where(rule).ToList();
  91. Assert.AreEqual(1, result.Count);
  92. Assert.AreEqual(10, result[0].id);
  93. }
  94. // ###3 = null
  95. {
  96. var query = GetQueryable();
  97. var item = query.Skip(10).FirstOrDefault();
  98. item.pid = null;
  99. var strRule = "{'field':'pid', 'operator': '=', 'value': null }".Replace("'", "\"");
  100. var rule = Json.Deserialize<FilterRule>(strRule);
  101. var result = query.Where(rule).FirstOrDefault();
  102. Assert.AreEqual(10, result.id);
  103. }
  104. }
  105. #endregion
  106. #region ##1.2 [bool] =
  107. {
  108. // ###1
  109. {
  110. var query = GetQueryable();
  111. var strRule = "{'field':'isEven', 'operator': '=', 'value':true }".Replace("'", "\"");
  112. var rule = Json.Deserialize<FilterRule>(strRule);
  113. var result = query.Where(rule).ToList();
  114. Assert.AreEqual(result.Count, 500);
  115. Assert.AreEqual(0, result[0].id);
  116. }
  117. // ###2
  118. {
  119. var query = GetQueryable();
  120. var strRule = "{'field':'isEven', 'operator': '=', 'value': 'false' }".Replace("'", "\"");
  121. var rule = Json.Deserialize<FilterRule>(strRule);
  122. var result = query.Where(rule).ToList();
  123. Assert.AreEqual(result.Count, 500);
  124. Assert.AreEqual(1, result[0].id);
  125. }
  126. }
  127. #endregion
  128. #region ##2.1 [number] !=
  129. {
  130. // ###1
  131. {
  132. var query = GetQueryable();
  133. var strRule = "{'field':'id', 'operator': '!=', 'value':10 }".Replace("'", "\"");
  134. var rule = Json.Deserialize<FilterRule>(strRule);
  135. var result = query.Where(rule).ToList();
  136. Assert.AreEqual(999, result.Count);
  137. }
  138. // ###2 != null
  139. {
  140. var query = GetQueryable();
  141. var item = query.Skip(10).FirstOrDefault();
  142. item.pid = null;
  143. var strRule = "{'field':'pid', 'operator': '!=', 'value': null }".Replace("'", "\"");
  144. var rule = Json.Deserialize<FilterRule>(strRule);
  145. var result = query.Where(rule).ToList();
  146. Assert.AreEqual(999, result.Count);
  147. }
  148. }
  149. #endregion
  150. #region ##2.2 [bool] !=
  151. {
  152. // ###1
  153. {
  154. var query = GetQueryable();
  155. var strRule = "{'field':'isEven', 'operator': '!=', 'value':true }".Replace("'", "\"");
  156. var rule = Json.Deserialize<FilterRule>(strRule);
  157. var result = query.Where(rule).ToList();
  158. Assert.AreEqual(result.Count, 500);
  159. Assert.AreEqual(1, result[0].id);
  160. }
  161. // ###2
  162. {
  163. var query = GetQueryable();
  164. var strRule = "{'field':'isEven', 'operator': '!=', 'value': 'false' }".Replace("'", "\"");
  165. var rule = Json.Deserialize<FilterRule>(strRule);
  166. var result = query.Where(rule).ToList();
  167. Assert.AreEqual(result.Count, 500);
  168. Assert.AreEqual(0, result[0].id);
  169. }
  170. }
  171. #endregion
  172. #region ##3 [number] > <
  173. {
  174. {
  175. var query = GetQueryable();
  176. var strRule = @"{'condition':'and', 'rules':[
  177. {'field':'id', 'operator': '>', 'value':10 },
  178. {'field':'id', 'operator': '<', 'value': '20' }
  179. ]}".Replace("'", "\"");
  180. var rule = Json.Deserialize<FilterRule>(strRule);
  181. var result = query.Where(rule).ToList();
  182. Assert.AreEqual(9, result.Count);
  183. Assert.AreEqual(11, result[0].id);
  184. }
  185. }
  186. #endregion
  187. #region ##4 [number] >= <=
  188. {
  189. {
  190. var query = GetQueryable();
  191. var strRule = @"{'condition':'and', 'rules':[
  192. {'field':'id', 'operator': '>=', 'value':10 },
  193. {'field':'id', 'operator': '<=', 'value': '20' }
  194. ]}".Replace("'", "\"");
  195. var rule = Json.Deserialize<FilterRule>(strRule);
  196. var result = query.Where(rule).ToList();
  197. Assert.AreEqual(11, result.Count);
  198. Assert.AreEqual(10, result[0].id);
  199. }
  200. }
  201. #endregion
  202. #endregion
  203. #region #3 In | NotIn
  204. #region ##1 In
  205. {
  206. {
  207. var query = GetQueryable();
  208. var strRule = "{'field':'id', 'operator': 'In', 'value': [3,4,5] }".Replace("'", "\"");
  209. var rule = Json.Deserialize<FilterRule>(strRule);
  210. var result = query.Where(rule).ToList();
  211. Assert.AreEqual(3, result.Count);
  212. Assert.AreEqual(5, result[2].id);
  213. }
  214. {
  215. var query = GetQueryable();
  216. var strRule = "{'field':'name', 'operator': 'In', 'value': [ 'name3', 'name4'] }".Replace("'", "\"");
  217. var rule = Json.Deserialize<FilterRule>(strRule);
  218. var result = query.Where(rule).ToList();
  219. Assert.AreEqual(2, result.Count);
  220. Assert.AreEqual("name3", result[0].name);
  221. }
  222. {
  223. var query = GetQueryable();
  224. query.FirstOrDefault().name = null;
  225. var strRule = @"{'condition':'or', 'rules':[
  226. {'field':'name', 'operator': 'IsNull' },
  227. {'field':'name', 'operator': 'In', 'value': [ 'name3', 'name4'] }
  228. ]}".Replace("'", "\"");
  229. var rule = Json.Deserialize<FilterRule>(strRule);
  230. var result = query.Where(rule).ToList();
  231. Assert.AreEqual(3, result.Count);
  232. Assert.AreEqual(null, result[0].name);
  233. Assert.AreEqual("name4", result[2].name);
  234. }
  235. }
  236. #endregion
  237. #region ##2 NotIn
  238. {
  239. var query = GetQueryable();
  240. query.FirstOrDefault().name = null;
  241. var strRule = @"{'condition':'and', 'rules':[
  242. {'field':'name', 'operator': 'IsNotNull' },
  243. {'field':'name', 'operator': 'NotIn', 'value': [ 'name3', 'name4'] }
  244. ]}".Replace("'", "\"");
  245. var rule = Json.Deserialize<FilterRule>(strRule);
  246. var result = query.Where(rule).ToList();
  247. Assert.AreEqual(997, result.Count);
  248. }
  249. #endregion
  250. #endregion
  251. #region #4 [string] operate
  252. #region ##1 Contains
  253. {
  254. var query = GetQueryable();
  255. var strRule = "{'field':'name', 'operator': 'Contains', 'value': '987' }".Replace("'", "\"");
  256. var rule = Json.Deserialize<FilterRule>(strRule);
  257. var result = query.Where(rule).ToList();
  258. Assert.AreEqual(1, result.Count);
  259. Assert.AreEqual(987, result.First().id);
  260. }
  261. #endregion
  262. #region ##2 NotContains
  263. {
  264. //###1
  265. {
  266. var query = GetQueryable();
  267. var strRule = "{'field':'name', 'operator': 'NotContains', 'value': '987' }".Replace("'", "\"");
  268. var rule = Json.Deserialize<FilterRule>(strRule);
  269. var result = query.Where(rule).ToList();
  270. Assert.AreEqual(999, result.Count);
  271. }
  272. //###2
  273. {
  274. var query = GetQueryable();
  275. query.Skip(987).FirstOrDefault().name = null;
  276. var strRule = "{'field':'name', 'operator': 'NotContains', 'value': '987' }".Replace("'", "\"");
  277. var rule = Json.Deserialize<FilterRule>(strRule);
  278. var result = query.Where(rule).ToList();
  279. Assert.AreEqual(1000, result.Count);
  280. }
  281. //###3
  282. {
  283. var query = GetQueryable();
  284. query.Skip(987).FirstOrDefault().name = "";
  285. var strRule = "{'field':'name', 'operator': 'NotContains', 'value': '987' }".Replace("'", "\"");
  286. var rule = Json.Deserialize<FilterRule>(strRule);
  287. var result = query.Where(rule).ToList();
  288. Assert.AreEqual(1000, result.Count);
  289. }
  290. }
  291. #endregion
  292. #region ##3 StartsWith
  293. {
  294. var query = GetQueryable();
  295. var strRule = "{'field':'name', 'operator': 'StartsWith', 'value': 'name98' }".Replace("'", "\"");
  296. var rule = Json.Deserialize<FilterRule>(strRule);
  297. var result = query.Where(rule).ToList();
  298. Assert.AreEqual(11, result.Count);
  299. }
  300. #endregion
  301. #region ##4 EndsWith
  302. {
  303. var query = GetQueryable();
  304. var strRule = "{'field':'name', 'operator': 'EndsWith', 'value': '987' }".Replace("'", "\"");
  305. var rule = Json.Deserialize<FilterRule>(strRule);
  306. var result = query.Where(rule).ToList();
  307. Assert.AreEqual(1, result.Count);
  308. }
  309. #endregion
  310. #region ##5 IsNullOrEmpty
  311. {
  312. //###1
  313. {
  314. var query = GetQueryable();
  315. query.Skip(10).FirstOrDefault().name = null;
  316. var strRule = "{'field':'name', 'operator': 'IsNullOrEmpty' }".Replace("'", "\"");
  317. var rule = Json.Deserialize<FilterRule>(strRule);
  318. var result = query.Where(rule).ToList();
  319. Assert.AreEqual(1, result.Count);
  320. }
  321. //###2
  322. {
  323. var query = GetQueryable();
  324. query.Skip(10).FirstOrDefault().name = "";
  325. var strRule = "{'field':'name', 'operator': 'IsNullOrEmpty' }".Replace("'", "\"");
  326. var rule = Json.Deserialize<FilterRule>(strRule);
  327. var result = query.Where(rule).ToList();
  328. Assert.AreEqual(1, result.Count);
  329. }
  330. }
  331. #endregion
  332. #region ##6 IsNotNullOrEmpty
  333. {
  334. //###1
  335. {
  336. var query = GetQueryable();
  337. query.Skip(10).FirstOrDefault().name = null;
  338. var strRule = "{'field':'name', 'operator': 'IsNotNullOrEmpty' }".Replace("'", "\"");
  339. var rule = Json.Deserialize<FilterRule>(strRule);
  340. var result = query.Where(rule).ToList();
  341. Assert.AreEqual(999, result.Count);
  342. }
  343. //###2
  344. {
  345. var query = GetQueryable();
  346. query.Skip(10).FirstOrDefault().name = "";
  347. var strRule = "{'field':'name', 'operator': 'IsNotNullOrEmpty' }".Replace("'", "\"");
  348. var rule = Json.Deserialize<FilterRule>(strRule);
  349. var result = query.Where(rule).ToList();
  350. Assert.AreEqual(999, result.Count);
  351. }
  352. }
  353. #endregion
  354. #endregion
  355. #region #5 nested field
  356. {
  357. var query = GetQueryable();
  358. var strRule = "{'field':'b1.name', 'operator': '=', 'value': 'name987_b1' }".Replace("'", "\"");
  359. var rule = Json.Deserialize<FilterRule>(strRule);
  360. var result = query.Where(rule).ToList();
  361. Assert.AreEqual(1, result.Count);
  362. Assert.AreEqual(987, result[0].id);
  363. }
  364. #endregion
  365. }
  366. #endregion
  367. }
  368. }