From f93e0f1b5482108521b96e4e09ebe352b2ac700e Mon Sep 17 00:00:00 2001 From: 28810 <28810@YEXIANGQIN> Date: Mon, 13 Jul 2020 18:12:06 +0800 Subject: [PATCH] =?UTF-8?q?-=20=E4=BF=AE=E5=A4=8D=20WhereDynamicFilter=20?= =?UTF-8?q?=E5=9C=A8=20System.Text.Json=20=E4=B8=8B=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98=20#371=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Examples/base_entity/Program.cs | 68 ++++++++++++++++++- FreeSql.DbContext/FreeSql.DbContext.xml | 9 --- FreeSql.Tests/FreeSql.Tests/UnitTest3.cs | 6 ++ .../SelectProvider/Select0Provider.cs | 12 ++-- 4 files changed, 78 insertions(+), 17 deletions(-) diff --git a/Examples/base_entity/Program.cs b/Examples/base_entity/Program.cs index 9d674f29..a6a50839 100644 --- a/Examples/base_entity/Program.cs +++ b/Examples/base_entity/Program.cs @@ -7,8 +7,12 @@ using Newtonsoft.Json.Linq; using System; using System.Data.Odbc; using System.Data.SqlClient; +using System.Data.SQLite; using System.Diagnostics; using System.Linq.Expressions; +using System.Text.Encodings.Web; +using System.Text.Json; +using System.Text.Json.Serialization; using System.Threading; using System.Threading.Tasks; @@ -40,8 +44,23 @@ namespace base_entity static AsyncLocal _asyncUow = new AsyncLocal(); + public class TestEnumCls + { + public CollationTypeEnum val { get; set; } = CollationTypeEnum.Binary; + } + static void Main(string[] args) { +// var result2 = Newtonsoft.Json.JsonConvert.DeserializeObject(@" +//{ +// ""val"": ""Binary"" +//}"); +// var result1 = System.Text.Json.JsonSerializer.Deserialize(@" +//{ +// ""val"": ""Binary"" +//}"); + + #region 初始化 IFreeSql var fsql = new FreeSql.FreeSqlBuilder() .UseAutoSyncStructure(true) @@ -90,7 +109,7 @@ namespace base_entity new Products { title = "product-4" }.Save(); new Products { title = "product-5" }.Save(); - Products.Select.WhereDynamicFilter(JsonConvert.DeserializeObject(@" + var wdy1 = JsonConvert.DeserializeObject(@" { ""Logic"" : ""Or"", ""Filters"" : @@ -125,7 +144,52 @@ namespace base_entity }, ] } -")).ToList(); +"); + var config = new JsonSerializerOptions() + { + PropertyNamingPolicy = null, + AllowTrailingCommas = true, + IgnoreNullValues = true, + Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping, + Converters = { new JsonStringEnumConverter() } + }; + var wdy2 = System.Text.Json.JsonSerializer.Deserialize(@" +{ + ""Logic"" : 1, + ""Filters"" : + [ + { + ""Field"" : ""title"", + ""Operator"" : 8, + ""Value"" : ""product-1"", + ""Filters"" : + [ + { + ""Field"" : ""title"", + ""Operator"" : 0, + ""Value"" : ""product-1111"" + } + ] + }, + { + ""Field"" : ""title"", + ""Operator"" : 8, + ""Value"" : ""product-2"" + }, + { + ""Field"" : ""title"", + ""Operator"" : 8, + ""Value"" : ""product-3"" + }, + { + ""Field"" : ""title"", + ""Operator"" : 8, + ""Value"" : ""product-4"" + } + ] +} +", config); + Products.Select.WhereDynamicFilter(wdy2).ToList(); var items1 = Products.Select.Limit(10).OrderByDescending(a => a.CreateTime).ToList(); var items2 = fsql.Select().Limit(10).OrderByDescending(a => a.CreateTime).ToList(); diff --git a/FreeSql.DbContext/FreeSql.DbContext.xml b/FreeSql.DbContext/FreeSql.DbContext.xml index 4854f49c..474ea8d5 100644 --- a/FreeSql.DbContext/FreeSql.DbContext.xml +++ b/FreeSql.DbContext/FreeSql.DbContext.xml @@ -486,14 +486,5 @@ - - - 批量注入 Repository,可以参考代码自行调整 - - - - - - diff --git a/FreeSql.Tests/FreeSql.Tests/UnitTest3.cs b/FreeSql.Tests/FreeSql.Tests/UnitTest3.cs index e2b66169..0ee3d1bb 100644 --- a/FreeSql.Tests/FreeSql.Tests/UnitTest3.cs +++ b/FreeSql.Tests/FreeSql.Tests/UnitTest3.cs @@ -175,6 +175,12 @@ namespace FreeSql.Tests .Page(1, 10).ToSql("Id"); + var sqlextMax1 = g.mysql.Select() + .GroupBy(a => a.Id) + .ToSql(a => new + { + Id = a.Key, EdiId = SqlExt.Max(a.Key).Over().ToValue() + }); var sqlextGroupConcat = g.mysql.Select() .InnerJoin((a, b) => b.Id == a.Id) diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs index dd0f788b..62e2d64d 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs @@ -1086,12 +1086,12 @@ namespace FreeSql.Internal.CommonProvider switch (fi.Operator) { - case DynamicFilterOperator.Contains: exp = Expression.Call(exp, MethodStringContains, Expression.Constant(fi.Value)); break; - case DynamicFilterOperator.StartsWith: exp = Expression.Call(exp, MethodStringStartsWith, Expression.Constant(fi.Value)); break; - case DynamicFilterOperator.EndsWith: exp = Expression.Call(exp, MethodStringEndsWith, Expression.Constant(fi.Value)); break; - case DynamicFilterOperator.NotContains: exp = Expression.Not(Expression.Call(exp, MethodStringContains, Expression.Constant(fi.Value))); break; - case DynamicFilterOperator.NotStartsWith: exp = Expression.Not(Expression.Call(exp, MethodStringStartsWith, Expression.Constant(fi.Value))); break; - case DynamicFilterOperator.NotEndsWith: exp = Expression.Not(Expression.Call(exp, MethodStringEndsWith, Expression.Constant(fi.Value))); break; + case DynamicFilterOperator.Contains: exp = Expression.Call(exp, MethodStringContains, Expression.Constant(Utils.GetDataReaderValue(exp.Type, fi.Value), exp.Type)); break; + case DynamicFilterOperator.StartsWith: exp = Expression.Call(exp, MethodStringStartsWith, Expression.Constant(Utils.GetDataReaderValue(exp.Type, fi.Value), exp.Type)); break; + case DynamicFilterOperator.EndsWith: exp = Expression.Call(exp, MethodStringEndsWith, Expression.Constant(Utils.GetDataReaderValue(exp.Type, fi.Value), exp.Type)); break; + case DynamicFilterOperator.NotContains: exp = Expression.Not(Expression.Call(exp, MethodStringContains, Expression.Constant(Utils.GetDataReaderValue(exp.Type, fi.Value), exp.Type))); break; + case DynamicFilterOperator.NotStartsWith: exp = Expression.Not(Expression.Call(exp, MethodStringStartsWith, Expression.Constant(Utils.GetDataReaderValue(exp.Type, fi.Value), exp.Type))); break; + case DynamicFilterOperator.NotEndsWith: exp = Expression.Not(Expression.Call(exp, MethodStringEndsWith, Expression.Constant(Utils.GetDataReaderValue(exp.Type, fi.Value), exp.Type))); break; case DynamicFilterOperator.Eq: case DynamicFilterOperator.Equals: