From 53669da86ebbefa94e5b2feb453efbe69e038008 Mon Sep 17 00:00:00 2001 From: 2881099 <2881099@qq.com> Date: Fri, 5 Feb 2021 11:06:44 +0800 Subject: [PATCH] =?UTF-8?q?-=20=E4=BC=98=E5=8C=96=20WhereDynamicFilter?= =?UTF-8?q?=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Examples/base_entity/Program.cs | 5 +++ .../Sqlite/Curd/SqliteSelectTest.cs | 41 +++++++++++++++++++ .../SelectProvider/Select0Provider.cs | 11 +++++ 3 files changed, 57 insertions(+) diff --git a/Examples/base_entity/Program.cs b/Examples/base_entity/Program.cs index 946fc5ca..5e73a594 100644 --- a/Examples/base_entity/Program.cs +++ b/Examples/base_entity/Program.cs @@ -208,6 +208,11 @@ namespace base_entity ""Operator"" : ""Range"", ""Value"" : [""101"",""202""] }, + { + ""Field"" : ""testint"", + ""Operator"" : ""contains"", + ""Value"" : ""123"" + }, ] } "); diff --git a/FreeSql.Tests/FreeSql.Tests/Sqlite/Curd/SqliteSelectTest.cs b/FreeSql.Tests/FreeSql.Tests/Sqlite/Curd/SqliteSelectTest.cs index f55d91d2..9fa50e58 100644 --- a/FreeSql.Tests/FreeSql.Tests/Sqlite/Curd/SqliteSelectTest.cs +++ b/FreeSql.Tests/FreeSql.Tests/Sqlite/Curd/SqliteSelectTest.cs @@ -2424,6 +2424,47 @@ FROM ""D_District"" a LEFT JOIN ""D_District"" a__Parent ON a__Parent.""Code"" = a.""ParentCode"" WHERE ((not((a.""Code"") LIKE '%val1%') AND not((a.""Name"") LIKE 'val2%') OR not((a.""Name"") LIKE '%val3') OR a.""ParentCode"" <> 'val4' OR a__Parent.""Code"" = 'val11' AND (a__Parent.""Name"") LIKE '%val22%' OR a__Parent.""Name"" = 'val33' OR a__Parent.""ParentCode"" = 'val44')) ORDER BY a__Parent.""Name""", sql); + + sql = fsql.Select().WhereDynamicFilter(JsonConvert.DeserializeObject(@" +{ + ""Logic"" : ""Or"", + ""Filters"" : + [ + { + ""Field"" : ""name"", + ""Operator"" : ""NotEndsWith"", + ""Value"" : ""testname01"" + }, + { + ""Field"" : ""no"", + ""Operator"" : ""NotEndsWith"", + ""Value"" : ""testname01"" + }, + { + ""Field"" : ""id"", + ""Operator"" : ""NotEndsWith"", + ""Value"" : ""testname01"" + }, + { + ""Field"" : ""status"", + ""Operator"" : ""eq"", + ""Value"" : ""finished"" + }, + ] +} +")).ToSql(); + 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); } + + class ts_dyfilter_enum01 + { + public Guid id { get; set; } + public string name { get; set; } + public int no { get; set; } + public ts_dyfilter_enum01_status status { get; set; } + } + public enum ts_dyfilter_enum01_status { staring, stoped, finished } } } diff --git a/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs b/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs index 75a75ceb..4218a323 100644 --- a/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs +++ b/FreeSql/Internal/CommonProvider/SelectProvider/Select0Provider.cs @@ -525,6 +525,17 @@ namespace FreeSql.Internal.CommonProvider { Expression exp = ConvertStringPropertyToExpression(fi.Field); switch (fi.Operator) + { + case DynamicFilterOperator.Contains: + case DynamicFilterOperator.StartsWith: + case DynamicFilterOperator.EndsWith: + case DynamicFilterOperator.NotContains: + case DynamicFilterOperator.NotStartsWith: + case DynamicFilterOperator.NotEndsWith: + if (exp.Type != typeof(string)) exp = Expression.TypeAs(exp, typeof(string)); + break; + } + switch (fi.Operator) { case DynamicFilterOperator.Contains: exp = Expression.Call(exp, MethodStringContains, Expression.Constant(Utils.GetDataReaderValue(exp.Type, fi.Value?.ToString()), exp.Type)); break; case DynamicFilterOperator.StartsWith: exp = Expression.Call(exp, MethodStringStartsWith, Expression.Constant(Utils.GetDataReaderValue(exp.Type, fi.Value?.ToString()), exp.Type)); break;