- 增加 DynamicFilter Custom 自定义解析;

This commit is contained in:
2881099
2021-12-09 00:21:20 +08:00
parent 59f14fcd13
commit 8a83fea60a
6 changed files with 155 additions and 15 deletions

View File

@ -1,11 +1,13 @@
using FreeSql.DataAnnotations;
using FreeSql.Internal.Model;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using System.Text;
using Xunit;
namespace FreeSql.Tests.Sqlite
@ -1233,7 +1235,7 @@ WHERE (((cast(a.""Id"" as character)) in (SELECT b.""Title""
//---- Select ----
var at0 = g.sqlite.Select<TestInclude_OneToManyModel2>()
.IncludeMany(a => a.childs.Where(m3 => m3.model2111Idaaa == a.model2id).Select(m3 => new TestInclude_OneToManyModel3 { id = m3.id }))
.IncludeMany(a => a.childs.Where(m3 => m3.model2111Idaaa == a.model2id).Select(m3 => new TestInclude_OneToManyModel3 { id = m3.id }))
.Where(a => a.model2id <= model1.id)
.ToList();
var at001 = g.sqlite.Select<TestInclude_OneToManyModel2>()
@ -1241,19 +1243,23 @@ WHERE (((cast(a.""Id"" as character)) in (SELECT b.""Title""
.Where(a => a.model2id <= model1.id)
.ToList(a => new
{
a.model2id, a.childs, childs2 = a.childs
a.model2id,
a.childs,
childs2 = a.childs
});
var at1 = g.sqlite.Select<TestInclude_OneToManyModel1>()
.IncludeMany(a => a.model2.childs.Where(m3 => m3.model2111Idaaa == a.model2.model2id).Select(m3 => new TestInclude_OneToManyModel3 { id = m3.id }))
.Where(a => a.id <= model1.id)
.ToList();
.ToList();
var at111 = g.sqlite.Select<TestInclude_OneToManyModel1>()
.IncludeMany(a => a.model2.childs.Where(m3 => m3.model2111Idaaa == a.model2.model2id).Select(m3 => new TestInclude_OneToManyModel3 { id = m3.id }))
.Where(a => a.id <= model1.id)
.ToList(a => new
{
a.id, a.model2.childs, childs2 = a.model2.childs
a.id,
a.model2.childs,
childs2 = a.model2.childs
});
var at2 = g.sqlite.Select<TestInclude_OneToManyModel1>()
@ -1267,7 +1273,9 @@ WHERE (((cast(a.""Id"" as character)) in (SELECT b.""Title""
.Where(a => a.id <= model1.id)
.ToList(a => new
{
a.id, a.model2.childs, childs2 = a.model2.childs
a.id,
a.model2.childs,
childs2 = a.model2.childs
});
var at00 = g.sqlite.Select<TestInclude_OneToManyModel2>()
@ -1279,7 +1287,9 @@ WHERE (((cast(a.""Id"" as character)) in (SELECT b.""Title""
.Where(a => a.model2id <= model1.id)
.ToList(a => new
{
a.model2id, a.childs, childs2 = a.childs
a.model2id,
a.childs,
childs2 = a.childs
});
var at11 = g.sqlite.Select<TestInclude_OneToManyModel1>()
@ -1290,9 +1300,11 @@ WHERE (((cast(a.""Id"" as character)) in (SELECT b.""Title""
.IncludeMany(a => a.model2.childs.Take(1).Where(m3 => m3.model2111Idaaa == a.model2.model2id).Select(m3 => new TestInclude_OneToManyModel3 { id = m3.id }))
.Where(a => a.id <= model1.id)
.ToList(a => new
{
a.id, a.model2.childs, childs2 = a.model2.childs
});
{
a.id,
a.model2.childs,
childs2 = a.model2.childs
});
var at22 = g.sqlite.Select<TestInclude_OneToManyModel1>()
.IncludeMany(a => a.model2.childs.Take(1).Where(m3 => m3.model2111Idaaa == a.model2.model2id).Select(m3 => new TestInclude_OneToManyModel3 { id = m3.id }),
@ -1305,7 +1317,9 @@ WHERE (((cast(a.""Id"" as character)) in (SELECT b.""Title""
.Where(a => a.id <= model1.id)
.ToList(a => new
{
a.id, a.model2.childs, childs2 = a.model2.childs
a.id,
a.model2.childs,
childs2 = a.model2.childs
});
}
@ -1724,7 +1738,9 @@ WHERE (((cast(a.""Id"" as character)) in (SELECT b.""Title""
.Where(a => a.Id == song1.Id || a.Id == song2.Id || a.Id == song3.Id)
.ToList(a => new
{
a.Id, a.Is_deleted, a.Tags
a.Id,
a.Is_deleted,
a.Tags
});
}
@ -2481,6 +2497,33 @@ ORDER BY a__Parent.""Name""", sql);
Assert.Equal(@"SELECT a.""id"", a.""name"", a.""no"", a.""status""
FROM ""ts_dyfilter_enum01"" a
WHERE ((not((a.""name"") LIKE '%testname01') OR not((a.""no"") LIKE '%testname01') OR not((a.""id"") LIKE '%testname01') OR a.""status"" = 2))", sql);
sql = fsql.Select<ts_dyfilter_enum01>().WhereDynamicFilter(JsonConvert.DeserializeObject<DynamicFilterInfo>(@"
{
""Logic"" : ""Or"",
""Filters"" :
[
{
""Field"" : ""MyRawSql FreeSql.Tests.Sqlite.DynamicFilterMyCustom,FreeSql.Tests"",
""Operator"" : ""Custom"",
""Value"" : ""(name,no) in (('testname01','testname01'))""
},
{
""Field"" : ""no"",
""Operator"" : ""NotEndsWith"",
""Value"" : ""testname01""
},
{
""Field"" : ""MyRawSql FreeSql.Tests.Sqlite.DynamicFilterMyCustom,FreeSql.Tests"",
""Operator"" : ""Custom"",
""Value"" : ""(id,status) in (('testname01','finished'))""
},
]
}
")).ToSql();
Assert.Equal(@"SELECT a.""id"", a.""name"", a.""no"", a.""status""
FROM ""ts_dyfilter_enum01"" a
WHERE (((name,no) in (('testname01','testname01')) OR not((a.""no"") LIKE '%testname01') OR (id,status) in (('testname01','finished'))))", sql);
}
class ts_dyfilter_enum01
@ -2492,4 +2535,36 @@ WHERE ((not((a.""name"") LIKE '%testname01') OR not((a.""no"") LIKE '%testname01
}
public enum ts_dyfilter_enum01_status { staring, stoped, finished }
}
public class DynamicFilterMyCustom
{
public static string MyRawSql(string value) => value;
public static string TupleIn(string value)
{
var sb = new StringBuilder();
var array = JArray.Parse(value);
var row = 0;
foreach(JObject item in array)
{
if (row++ == 0)
{
sb.Append("(");
var propNames = item.Properties().Select(a => a.Name);
sb.Append(string.Join(", ", propNames));
sb.Append(") IN (");
}
if (row == array.Count - 1)
{
sb.Append(")");
}
if (row > 1) sb.Append(", ");
sb.Append("(");
var propValues = item.Values().Select(a => a?.ToString().Replace("'", "''")); //注入处理
sb.Append(string.Join(", ", propValues));
sb.Append(")");
}
return sb.ToString();
}
}
}