mirror of
https://github.com/nsnail/FreeSql.git
synced 2025-06-19 04:18:16 +08:00
- 增加 DynamicFilter Custom 自定义解析;
This commit is contained in:
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user