|
@@ -2,13 +2,17 @@
|
|
|
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();
|
|
|
+ IQueryable GetQueryable() => DataSource.GetIQueryable();
|
|
|
|
|
|
|
|
|
[TestMethod]
|
|
@@ -40,212 +44,412 @@ namespace Vit.Linq.MsTest
|
|
|
}
|
|
|
|
|
|
|
|
|
- /*
|
|
|
-
|
|
|
- #region (x.2)DataFilter
|
|
|
+ #region Test_FilterRule
|
|
|
[TestMethod]
|
|
|
- public void TestDataFilter()
|
|
|
+ public void Test_FilterRule()
|
|
|
{
|
|
|
- var query = DataSource.GetIQueryable();
|
|
|
|
|
|
-
|
|
|
-
|
|
|
+ #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 (x.1) =
|
|
|
+ #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
|
|
|
|
|
|
- //(x.x.1)
|
|
|
+
|
|
|
+ #region #2 [number | string | bool] compare
|
|
|
+
|
|
|
+ #region ##1.1 [number] =
|
|
|
+ {
|
|
|
+ // ###1
|
|
|
{
|
|
|
- var result = query.IQueryable_Where(new[] { new DataFilter { field = "id", opt = "=", value = 10 } }).IQueryable_ToList<ModelA>();
|
|
|
- Assert.AreEqual(result.Count, 1);
|
|
|
- Assert.AreEqual(result[0].id, 10);
|
|
|
+ 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);
|
|
|
}
|
|
|
|
|
|
- //(x.x.2) == null
|
|
|
+ // ###2
|
|
|
{
|
|
|
- var item = query.IQueryable_Skip(10).IQueryable_FirstOrDefault<ModelA>();
|
|
|
- var pid = item.pid;
|
|
|
+ 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 result = query.IQueryable_Where(new[] { new DataFilter { field = "pid", opt = "=", value = null } }).IQueryable_FirstOrDefault<ModelA>();
|
|
|
- Assert.AreEqual(result?.id, 10);
|
|
|
- item.pid = pid;
|
|
|
+ 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 (x.2) !=
|
|
|
+ #region ##2.1 [number] !=
|
|
|
{
|
|
|
- //(x.x.1)
|
|
|
+ // ###1
|
|
|
{
|
|
|
- var result = query.IQueryable_Where(new[] { new DataFilter { field = "id", opt = "!=", value = 10 } }).IQueryable_ToList<ModelA>();
|
|
|
- Assert.AreEqual(result.Count, 999);
|
|
|
+ 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);
|
|
|
}
|
|
|
|
|
|
- //(x.x.2) != null
|
|
|
+ // ###2 != null
|
|
|
{
|
|
|
- var item = query.IQueryable_Skip(10).IQueryable_FirstOrDefault<ModelA>();
|
|
|
- var pid = item.pid;
|
|
|
+ var query = GetQueryable();
|
|
|
+
|
|
|
+ var item = query.Skip(10).FirstOrDefault();
|
|
|
item.pid = null;
|
|
|
|
|
|
- var result = query.IQueryable_Where(new[] { new DataFilter { field = "pid", opt = "!=", value = null } }).IQueryable_ToList<ModelA>();
|
|
|
- Assert.AreEqual(result.Count, 999);
|
|
|
- item.pid = pid;
|
|
|
+ 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 (x.3) > <
|
|
|
+ #region ##2.2 [bool] !=
|
|
|
{
|
|
|
- var result = query.IQueryable_Where(new[] { new DataFilter { field = "id", opt = ">", value = 10 }, new DataFilter { field = "id", opt = "<", value = 20 } }).IQueryable_ToList<ModelA>();
|
|
|
- Assert.AreEqual(result.Count, 9);
|
|
|
+ // ###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 (x.4) >= <=
|
|
|
+
|
|
|
+ #region ##3 [number] > <
|
|
|
{
|
|
|
- var result = query.IQueryable_Where(new[] { new DataFilter { field = "id", opt = ">=", value = 10 }, new DataFilter { field = "id", opt = "<=", value = 20 } }).IQueryable_ToList<ModelA>();
|
|
|
- Assert.AreEqual(result.Count, 11);
|
|
|
+ {
|
|
|
+ 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 (x.5) Contains
|
|
|
+ #region ##4 [number] >= <=
|
|
|
{
|
|
|
- var result = query.IQueryable_Where(new[] { new DataFilter { field = "name", opt = "Contains", value = "987" } }).IQueryable_ToList<ModelA>();
|
|
|
- Assert.AreEqual(result.Count, 1);
|
|
|
- Assert.AreEqual(result[0].id, 987);
|
|
|
+ {
|
|
|
+ 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
|
|
|
|
|
|
- #region (x.x) NotContains
|
|
|
- {
|
|
|
+ #endregion
|
|
|
+
|
|
|
+
|
|
|
+ #region #3 in | not in
|
|
|
|
|
|
- //(x.x.1)
|
|
|
+ #region ##1 in
|
|
|
+ {
|
|
|
{
|
|
|
- var result = query.IQueryable_Where(new[] { new DataFilter { field = "name", opt = "NotContains", value = "987" } }).IQueryable_ToList<ModelA>();
|
|
|
- Assert.AreEqual(result.Count, 999);
|
|
|
- }
|
|
|
+ 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);
|
|
|
+ }
|
|
|
|
|
|
- //(x.x.2)
|
|
|
{
|
|
|
- var item = query.IQueryable_Where(
|
|
|
- new[] { new DataFilter { field = "name", opt = "Contains",value="987" } }
|
|
|
- ).IQueryable_FirstOrDefault<ModelA>();
|
|
|
- var oriName = item.name;
|
|
|
-
|
|
|
- item.name = null;
|
|
|
- var result = query.IQueryable_Where(new[] { new DataFilter { field = "name", opt = "NotContains", value = "987" } }).IQueryable_ToList<ModelA>();
|
|
|
- Assert.AreEqual(result.Count, 1000);
|
|
|
- item.name = oriName;
|
|
|
+ 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);
|
|
|
}
|
|
|
|
|
|
- //(x.x.3)
|
|
|
{
|
|
|
- var item = query.IQueryable_Where(
|
|
|
- new[] { new DataFilter { field = "name", opt = "Contains", value = "987" } }
|
|
|
- ).IQueryable_FirstOrDefault<ModelA>();
|
|
|
- var oriName = item.name;
|
|
|
-
|
|
|
- item.name = "";
|
|
|
- var result = query.IQueryable_Where(new[] { new DataFilter { field = "name", opt = "NotContains", value = "987" } }).IQueryable_ToList<ModelA>();
|
|
|
- Assert.AreEqual(result.Count, 1000);
|
|
|
- item.name = oriName;
|
|
|
+ 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 (x.6) StartsWith
|
|
|
+ #region ##2 not in
|
|
|
{
|
|
|
- var result = query.IQueryable_Where(new[] { new DataFilter { field = "name", opt = "StartsWith", value = "name98" } }).IQueryable_ToList<ModelA>();
|
|
|
- Assert.AreEqual(result.Count, 11);
|
|
|
+ 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
|
|
|
|
|
|
- #region (x.7) EndsWith
|
|
|
+ #endregion
|
|
|
+
|
|
|
+
|
|
|
+ #region #4 [string] operate
|
|
|
+
|
|
|
+ #region ##1 contains
|
|
|
{
|
|
|
- var result = query.IQueryable_Where(new[] { new DataFilter { field = "name", opt = "EndsWith", value = "987" } }).IQueryable_ToList<ModelA>();
|
|
|
- Assert.AreEqual(result.Count, 1);
|
|
|
+ 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 (x.x) IsNullOrEmpty
|
|
|
+ #region ##2 not contains
|
|
|
{
|
|
|
- var item = query.IQueryable_Skip(10).IQueryable_FirstOrDefault<ModelA>();
|
|
|
- var oriName = item.name;
|
|
|
+ //###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);
|
|
|
+ }
|
|
|
+
|
|
|
|
|
|
- //(x.x.1)
|
|
|
+ //###2
|
|
|
{
|
|
|
- item.name = null;
|
|
|
- var result = query.IQueryable_Where(new[] { new DataFilter { field = "name", opt = "IsNullOrEmpty" } }).IQueryable_ToList<ModelA>();
|
|
|
- Assert.AreEqual(result.Count, 1);
|
|
|
- item.name = oriName;
|
|
|
+ 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);
|
|
|
}
|
|
|
- //(x.x.2)
|
|
|
+
|
|
|
+ //###3
|
|
|
{
|
|
|
- item.name = "";
|
|
|
- var result = query.IQueryable_Where(new[] { new DataFilter { field = "name", opt = "IsNullOrEmpty" } }).IQueryable_ToList<ModelA>();
|
|
|
- Assert.AreEqual(result.Count, 1);
|
|
|
- item.name = oriName;
|
|
|
+ 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 (x.x) IsNotNullOrEmpty
|
|
|
+ #region ##3 starts with
|
|
|
{
|
|
|
- var item = query.IQueryable_Skip(10).IQueryable_FirstOrDefault<ModelA>();
|
|
|
- var oriName = item.name;
|
|
|
+ var query = GetQueryable();
|
|
|
|
|
|
- //(x.x.1)
|
|
|
- {
|
|
|
- item.name = null;
|
|
|
- var result = query.IQueryable_Where(
|
|
|
- new[] { new DataFilter { field = "name", opt = "IsNotNullOrEmpty" } }
|
|
|
- )
|
|
|
- .IQueryable_ToList<ModelA>();
|
|
|
- Assert.AreEqual(result.Count, 999);
|
|
|
- item.name = oriName;
|
|
|
- }
|
|
|
- //(x.x.2)
|
|
|
- {
|
|
|
- item.name = "";
|
|
|
- var result = query.IQueryable_Where(new[] { new DataFilter { field = "name", opt = "IsNotNullOrEmpty" } }).IQueryable_ToList<ModelA>();
|
|
|
- Assert.AreEqual(result.Count, 999);
|
|
|
- item.name = oriName;
|
|
|
- }
|
|
|
+ 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 (x.8) In 1
|
|
|
+ #region ##4 ends with
|
|
|
{
|
|
|
- var result = query.IQueryable_Where(new[] { new DataFilter { field = "id", opt = "In", value = new int[] { 3, 4, 5 } } }).IQueryable_ToList<ModelA>();
|
|
|
- Assert.AreEqual(result.Count, 3);
|
|
|
+ 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 (x.9) In 2
|
|
|
+ #region ##5 is null or empty
|
|
|
{
|
|
|
- query.IQueryable_FirstOrDefault<ModelA>().name = null;
|
|
|
- var result = query.IQueryable_Where(new[] { new DataFilter { field = "name", opt = "In", value = new[] { "name3", "name4", null } } }).IQueryable_ToList<ModelA>();
|
|
|
- Assert.AreEqual(result.Count, 3);
|
|
|
+ //###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 (x.10) NotIn
|
|
|
+ #region ##6 is not null or empty
|
|
|
{
|
|
|
- var result = query.IQueryable_Where(new[] { new DataFilter { field = "name", opt = "NotIn", value = new[] { "name3", "name4", null } } }).IQueryable_ToList<ModelA>();
|
|
|
- Assert.AreEqual(result.Count, 997);
|
|
|
+ //###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
|
|
|
|
|
|
|
|
|
- #region (x.11) 多级field
|
|
|
+ #endregion
|
|
|
+
|
|
|
+
|
|
|
+ #region #5 nested field
|
|
|
{
|
|
|
- var result = query.IQueryable_Where(new[] { new DataFilter { field = "b1.name", opt = "=", value = "name987_b1" } }).IQueryable_ToList<ModelA>();
|
|
|
- Assert.AreEqual(result.Count, 1);
|
|
|
- Assert.AreEqual(result[0].id, 987);
|
|
|
+ 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
|
|
|
|
|
@@ -253,10 +457,21 @@ namespace Vit.Linq.MsTest
|
|
|
|
|
|
#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>();
|
|
|
}
|
|
|
}
|