123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477 |
- using Vit.Extensions.Linq_Extensions;
- using Microsoft.VisualStudio.TestTools.UnitTesting;
- using System.Collections.Generic;
- using System.Linq;
- using Vit.Core.Module.Serialization;
- using Vit.Linq.QueryBuilder;
- using Vit.Linq.MsTest.Extensions;
- namespace Vit.Linq.MsTest
- {
- [TestClass]
- public class IQueryable_QueryBuilder_Test
- {
- IQueryable GetQueryable() => DataSource.GetIQueryable();
- [TestMethod]
- public void Test_ToList()
- {
- var query = GetQueryable();
- #region Count ToList ToArray
- {
- int count = query.IQueryable_Count();
- Assert.AreEqual(1000, count);
- var list1 = query.IQueryable_ToList<ModelA>();
- Assert.AreEqual(1000, list1.Count);
- var list2 = query.IQueryable_ToList() as List<ModelA>;
- Assert.AreEqual(1000, list2.Count);
- var array1 = query.IQueryable_ToArray<ModelA>();
- Assert.AreEqual(1000, array1.Length);
- var array2 = query.IQueryable_ToArray() as ModelA[];
- Assert.AreEqual(1000, array2.Length);
- }
- #endregion
- }
- #region Test_FilterRule
- [TestMethod]
- public void Test_FilterRule()
- {
- #region #1 [object] is null | is not null
- #region ##1 is null
- {
- var query = GetQueryable();
- var item = query.Skip(10).FirstOrDefault();
- item.name = null;
- var strRule = "{'field':'name', 'operator': 'is null' }".Replace("'", "\"");
- var rule = Json.Deserialize<FilterRule>(strRule);
- var result = query.Where(rule).ToList();
- Assert.AreEqual(1, result.Count);
- Assert.AreEqual(10, result[0].id);
- }
- #endregion
- #region ##2 is not null
- {
- var query = GetQueryable();
- var item = query.Skip(10).FirstOrDefault();
- item.name = null;
- var strRule = "{'field':'name', 'operator': 'is not null' }".Replace("'", "\"");
- var rule = Json.Deserialize<FilterRule>(strRule);
- var result = query.Where(rule).ToList();
- Assert.AreEqual(999, result.Count);
- }
- #endregion
- #endregion
- #region #2 [number | string | bool] compare
- #region ##1.1 [number] =
- {
- // ###1
- {
- var query = GetQueryable();
- var strRule = "{'field':'id', 'operator': '=', 'value':10 }".Replace("'", "\"");
- var rule = Json.Deserialize<FilterRule>(strRule);
- var result = query.Where(rule).ToList();
- Assert.AreEqual(1, result.Count);
- Assert.AreEqual(10, result[0].id);
- }
- // ###2
- {
- var query = GetQueryable();
- var strRule = "{'field':'id', 'operator': '=', 'value': '10' }".Replace("'", "\"");
- var rule = Json.Deserialize<FilterRule>(strRule);
- var result = query.Where(rule).ToList();
- Assert.AreEqual(1, result.Count);
- Assert.AreEqual(10, result[0].id);
- }
- // ###3 = null
- {
- var query = GetQueryable();
- var item = query.Skip(10).FirstOrDefault();
- item.pid = null;
- var strRule = "{'field':'pid', 'operator': '=', 'value': null }".Replace("'", "\"");
- var rule = Json.Deserialize<FilterRule>(strRule);
- var result = query.Where(rule).FirstOrDefault();
- Assert.AreEqual(10, result.id);
- }
- }
- #endregion
- #region ##1.2 [bool] =
- {
- // ###1
- {
- var query = GetQueryable();
- var strRule = "{'field':'isEven', 'operator': '=', 'value':true }".Replace("'", "\"");
- var rule = Json.Deserialize<FilterRule>(strRule);
- var result = query.Where(rule).ToList();
- Assert.AreEqual(result.Count, 500);
- Assert.AreEqual(0, result[0].id);
- }
- // ###2
- {
- var query = GetQueryable();
- var strRule = "{'field':'isEven', 'operator': '=', 'value': 'false' }".Replace("'", "\"");
- var rule = Json.Deserialize<FilterRule>(strRule);
- var result = query.Where(rule).ToList();
- Assert.AreEqual(result.Count, 500);
- Assert.AreEqual(1, result[0].id);
- }
- }
- #endregion
- #region ##2.1 [number] !=
- {
- // ###1
- {
- var query = GetQueryable();
- var strRule = "{'field':'id', 'operator': '!=', 'value':10 }".Replace("'", "\"");
- var rule = Json.Deserialize<FilterRule>(strRule);
- var result = query.Where(rule).ToList();
- Assert.AreEqual(999, result.Count);
- }
- // ###2 != null
- {
- var query = GetQueryable();
- var item = query.Skip(10).FirstOrDefault();
- item.pid = null;
- var strRule = "{'field':'pid', 'operator': '!=', 'value': null }".Replace("'", "\"");
- var rule = Json.Deserialize<FilterRule>(strRule);
- var result = query.Where(rule).ToList();
- Assert.AreEqual(999, result.Count);
- }
- }
- #endregion
- #region ##2.2 [bool] !=
- {
- // ###1
- {
- var query = GetQueryable();
- var strRule = "{'field':'isEven', 'operator': '!=', 'value':true }".Replace("'", "\"");
- var rule = Json.Deserialize<FilterRule>(strRule);
- var result = query.Where(rule).ToList();
- Assert.AreEqual(result.Count, 500);
- Assert.AreEqual(1, result[0].id);
- }
- // ###2
- {
- var query = GetQueryable();
- var strRule = "{'field':'isEven', 'operator': '!=', 'value': 'false' }".Replace("'", "\"");
- var rule = Json.Deserialize<FilterRule>(strRule);
- var result = query.Where(rule).ToList();
- Assert.AreEqual(result.Count, 500);
- Assert.AreEqual(0, result[0].id);
- }
- }
- #endregion
- #region ##3 [number] > <
- {
- {
- var query = GetQueryable();
- var strRule = @"{'condition':'and', 'rules':[
- {'field':'id', 'operator': '>', 'value':10 },
- {'field':'id', 'operator': '<', 'value': '20' }
- ]}".Replace("'", "\"");
- var rule = Json.Deserialize<FilterRule>(strRule);
- var result = query.Where(rule).ToList();
- Assert.AreEqual(9, result.Count);
- Assert.AreEqual(11, result[0].id);
- }
- }
- #endregion
- #region ##4 [number] >= <=
- {
- {
- var query = GetQueryable();
- var strRule = @"{'condition':'and', 'rules':[
- {'field':'id', 'operator': '>=', 'value':10 },
- {'field':'id', 'operator': '<=', 'value': '20' }
- ]}".Replace("'", "\"");
- var rule = Json.Deserialize<FilterRule>(strRule);
- var result = query.Where(rule).ToList();
- Assert.AreEqual(11, result.Count);
- Assert.AreEqual(10, result[0].id);
- }
- }
- #endregion
- #endregion
- #region #3 in | not in
- #region ##1 in
- {
- {
- var query = GetQueryable();
- var strRule = "{'field':'id', 'operator': 'in', 'value': [3,4,5] }".Replace("'", "\"");
- var rule = Json.Deserialize<FilterRule>(strRule);
- var result = query.Where(rule).ToList();
- Assert.AreEqual(3, result.Count);
- Assert.AreEqual(5, result[2].id);
- }
- {
- var query = GetQueryable();
- var strRule = "{'field':'name', 'operator': 'in', 'value': [ 'name3', 'name4'] }".Replace("'", "\"");
- var rule = Json.Deserialize<FilterRule>(strRule);
- var result = query.Where(rule).ToList();
- Assert.AreEqual(2, result.Count);
- Assert.AreEqual("name3", result[0].name);
- }
- {
- var query = GetQueryable();
- query.FirstOrDefault().name = null;
- var strRule = @"{'condition':'or', 'rules':[
- {'field':'name', 'operator': 'is null' },
- {'field':'name', 'operator': 'in', 'value': [ 'name3', 'name4'] }
- ]}".Replace("'", "\"");
- var rule = Json.Deserialize<FilterRule>(strRule);
- var result = query.Where(rule).ToList();
- Assert.AreEqual(3, result.Count);
- Assert.AreEqual(null, result[0].name);
- Assert.AreEqual("name4", result[2].name);
- }
- }
- #endregion
- #region ##2 not in
- {
- var query = GetQueryable();
- query.FirstOrDefault().name = null;
- var strRule = @"{'condition':'and', 'rules':[
- {'field':'name', 'operator': 'is not null' },
- {'field':'name', 'operator': 'not in', 'value': [ 'name3', 'name4'] }
- ]}".Replace("'", "\"");
- var rule = Json.Deserialize<FilterRule>(strRule);
- var result = query.Where(rule).ToList();
- Assert.AreEqual(997, result.Count);
- }
- #endregion
- #endregion
- #region #4 [string] operate
- #region ##1 contains
- {
- var query = GetQueryable();
- var strRule = "{'field':'name', 'operator': 'contains', 'value': '987' }".Replace("'", "\"");
- var rule = Json.Deserialize<FilterRule>(strRule);
- var result = query.Where(rule).ToList();
- Assert.AreEqual(1, result.Count);
- Assert.AreEqual(987, result.First().id);
- }
- #endregion
- #region ##2 not contains
- {
- //###1
- {
- var query = GetQueryable();
- var strRule = "{'field':'name', 'operator': 'not contains', 'value': '987' }".Replace("'", "\"");
- var rule = Json.Deserialize<FilterRule>(strRule);
- var result = query.Where(rule).ToList();
- Assert.AreEqual(999, result.Count);
- }
- //###2
- {
- var query = GetQueryable();
- query.Skip(987).FirstOrDefault().name = null;
- var strRule = "{'field':'name', 'operator': 'not contains', 'value': '987' }".Replace("'", "\"");
- var rule = Json.Deserialize<FilterRule>(strRule);
- var result = query.Where(rule).ToList();
- Assert.AreEqual(1000, result.Count);
- }
- //###3
- {
- var query = GetQueryable();
- query.Skip(987).FirstOrDefault().name = "";
- var strRule = "{'field':'name', 'operator': 'not contains', 'value': '987' }".Replace("'", "\"");
- var rule = Json.Deserialize<FilterRule>(strRule);
- var result = query.Where(rule).ToList();
- Assert.AreEqual(1000, result.Count);
- }
- }
- #endregion
- #region ##3 starts with
- {
- var query = GetQueryable();
- var strRule = "{'field':'name', 'operator': 'starts with', 'value': 'name98' }".Replace("'", "\"");
- var rule = Json.Deserialize<FilterRule>(strRule);
- var result = query.Where(rule).ToList();
- Assert.AreEqual(11, result.Count);
- }
- #endregion
- #region ##4 ends with
- {
- var query = GetQueryable();
- var strRule = "{'field':'name', 'operator': 'ends with', 'value': '987' }".Replace("'", "\"");
- var rule = Json.Deserialize<FilterRule>(strRule);
- var result = query.Where(rule).ToList();
- Assert.AreEqual(1, result.Count);
- }
- #endregion
- #region ##5 is null or empty
- {
- //###1
- {
- var query = GetQueryable();
- query.Skip(10).FirstOrDefault().name = null;
- var strRule = "{'field':'name', 'operator': 'is null or empty' }".Replace("'", "\"");
- var rule = Json.Deserialize<FilterRule>(strRule);
- var result = query.Where(rule).ToList();
- Assert.AreEqual(1, result.Count);
- }
- //###2
- {
- var query = GetQueryable();
- query.Skip(10).FirstOrDefault().name = "";
- var strRule = "{'field':'name', 'operator': 'is null or empty' }".Replace("'", "\"");
- var rule = Json.Deserialize<FilterRule>(strRule);
- var result = query.Where(rule).ToList();
- Assert.AreEqual(1, result.Count);
- }
- }
- #endregion
- #region ##6 is not null or empty
- {
- //###1
- {
- var query = GetQueryable();
- query.Skip(10).FirstOrDefault().name = null;
- var strRule = "{'field':'name', 'operator': 'is not null or empty' }".Replace("'", "\"");
- var rule = Json.Deserialize<FilterRule>(strRule);
- var result = query.Where(rule).ToList();
- Assert.AreEqual(999, result.Count);
- }
- //###2
- {
- var query = GetQueryable();
- query.Skip(10).FirstOrDefault().name = "";
- var strRule = "{'field':'name', 'operator': 'is not null or empty' }".Replace("'", "\"");
- var rule = Json.Deserialize<FilterRule>(strRule);
- var result = query.Where(rule).ToList();
- Assert.AreEqual(999, result.Count);
- }
- }
- #endregion
- #endregion
- #region #5 nested field
- {
- var query = GetQueryable();
- var strRule = "{'field':'b1.name', 'operator': '=', 'value': 'name987_b1' }".Replace("'", "\"");
- var rule = Json.Deserialize<FilterRule>(strRule);
- var result = query.Where(rule).ToList();
- Assert.AreEqual(1, result.Count);
- Assert.AreEqual(987, result[0].id);
- }
- #endregion
- }
- #endregion
- }
- }
- namespace Vit.Linq.MsTest.Extensions
- {
- static class IQueryableExtensions
- {
- public static IQueryable Where(this IQueryable source, IFilterRule rule) => source.IQueryable_Where(rule);
- public static IQueryable Skip(this IQueryable source, int count) => source.IQueryable_Skip(count);
- public static ModelA FirstOrDefault(this IQueryable source) => source.IQueryable_FirstOrDefault<ModelA>();
- public static List<ModelA> ToList(this IQueryable source) => source.IQueryable_ToList<ModelA>();
- }
- }
|