From 05cf13f560982ee44bf91bb4db41b78715e84929 Mon Sep 17 00:00:00 2001 From: 28810 <28810@YEXIANGQIN> Date: Thu, 5 Dec 2019 20:10:39 +0800 Subject: [PATCH] =?UTF-8?q?-=20=E4=BC=98=E5=8C=96=20GlobalFilter=20Apply?= =?UTF-8?q?=20=E8=87=AA=E5=8A=A8=E9=87=8D=E5=91=BD=E5=90=8D=E8=A1=A8?= =?UTF-8?q?=E8=BE=BE=E5=BC=8F=E5=8F=82=E6=95=B0=E5=90=8D=EF=BC=8C=E9=81=BF?= =?UTF-8?q?=E5=85=8D=E5=86=85=E5=AE=B9=E9=87=8D=E5=A4=8D=E9=97=AE=E9=A2=98?= =?UTF-8?q?=EF=BC=9B=20-=20=E4=BF=AE=E5=A4=8D=20=E8=A1=A8=E8=BE=BE?= =?UTF-8?q?=E5=BC=8F=E8=A7=A3=E6=9E=90=20Guid.NewGuid()=20=E7=9A=84?= =?UTF-8?q?=E9=94=99=E8=AF=AF=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FreeSql.Tests/FreeSql.Tests/FreeSql.Tests.xml | 49 ------------------- FreeSql.Tests/FreeSql.Tests/UnitTest2.cs | 24 +++++++++ FreeSql/Internal/CommonExpression.cs | 2 +- FreeSql/Internal/GlobalFilter.cs | 8 ++- .../FreeSql.Provider.MySql/MySqlExpression.cs | 12 ++--- .../Default/OdbcExpression.cs | 12 ++--- .../MySql/OdbcMySqlExpression.cs | 12 ++--- .../Oracle/OdbcOracleExpression.cs | 12 ++--- .../PostgreSQL/OdbcPostgreSQLExpression.cs | 10 ++-- .../SqlServer/OdbcSqlServerExpression.cs | 12 ++--- .../OracleExpression.cs | 12 ++--- .../PostgreSQLExpression.cs | 10 ++-- .../SqlServerExpression.cs | 12 ++--- .../SqliteExpression.cs | 12 ++--- 14 files changed, 90 insertions(+), 109 deletions(-) diff --git a/FreeSql.Tests/FreeSql.Tests/FreeSql.Tests.xml b/FreeSql.Tests/FreeSql.Tests/FreeSql.Tests.xml index 7fce6993..5b80bfb0 100644 --- a/FreeSql.Tests/FreeSql.Tests/FreeSql.Tests.xml +++ b/FreeSql.Tests/FreeSql.Tests/FreeSql.Tests.xml @@ -464,54 +464,5 @@ 部门对象 - - - 入学年份 - - - - - 学段 - - - - - 人数 - - - - - - - - - - - - - - - - - - - - - 待标注 - - - - - 合格 - - - - - 不合格 - - - - - diff --git a/FreeSql.Tests/FreeSql.Tests/UnitTest2.cs b/FreeSql.Tests/FreeSql.Tests/UnitTest2.cs index 3426816e..22d54a76 100644 --- a/FreeSql.Tests/FreeSql.Tests/UnitTest2.cs +++ b/FreeSql.Tests/FreeSql.Tests/UnitTest2.cs @@ -200,9 +200,33 @@ namespace FreeSql.Tests public string Name { get; set; } } + public class gf_t1 + { + public Guid id { get; set; } + public int rowstate { get; set; } + } + public class gf_t2 + { + public Guid id { get; set; } + public decimal rowstate { get; set; } + } + public class gf_t3 + { + public Guid id { get; set; } + public decimal rowstate { get; set; } + } + [Fact] public void Test02() { + g.mysql.GlobalFilter.Apply("gft1", a => a.rowstate > -1) + .Apply("gft2", a => a.rowstate > -2) + .Apply("gft3", a => a.rowstate > -3); + + var gft1 = g.mysql.Select().Where(a => a.id == Guid.NewGuid()).ToList(); + var gft2 = g.mysql.Select().Where(a => a.id == Guid.NewGuid()).ToList(); + var gft3 = g.mysql.Select().Where(a => a.id == Guid.NewGuid()).ToList(); + var tekset = g.sqlite.Select().IncludeMany(a => a.departments).ToList(); g.sqlserver.Delete().Where("1=1").ExecuteAffrows(); diff --git a/FreeSql/Internal/CommonExpression.cs b/FreeSql/Internal/CommonExpression.cs index d767c504..b4324998 100644 --- a/FreeSql/Internal/CommonExpression.cs +++ b/FreeSql/Internal/CommonExpression.cs @@ -1335,7 +1335,7 @@ namespace FreeSql.Internal } return null; } - class ReplaceVisitor : ExpressionVisitor + internal class ReplaceVisitor : ExpressionVisitor { private ParameterExpression parameter; public Expression Modify(Expression expression, ParameterExpression parameter) diff --git a/FreeSql/Internal/GlobalFilter.cs b/FreeSql/Internal/GlobalFilter.cs index 40bab709..01992c9f 100644 --- a/FreeSql/Internal/GlobalFilter.cs +++ b/FreeSql/Internal/GlobalFilter.cs @@ -32,7 +32,13 @@ namespace FreeSql.Internal _filters.TryGetValue(name, out var item); if (item == null) item = new Item { Id = ++_id, Name = name }; - item.Where = where; + + var newParameter = Expression.Parameter(typeof(TEntity), $"gf{_id}"); + var newlambda = Expression.Lambda>( + new CommonExpression.ReplaceVisitor().Modify(where.Body, newParameter), + newParameter + ); + item.Where = newlambda; _filters.AddOrUpdate(name, item, (_, __) => item); return this; } diff --git a/Providers/FreeSql.Provider.MySql/MySqlExpression.cs b/Providers/FreeSql.Provider.MySql/MySqlExpression.cs index 36477266..8df2fa3b 100644 --- a/Providers/FreeSql.Provider.MySql/MySqlExpression.cs +++ b/Providers/FreeSql.Provider.MySql/MySqlExpression.cs @@ -70,21 +70,21 @@ namespace FreeSql.MySql case "System.UInt64": return $"cast({getExp(callExp.Arguments[0])} as unsigned)"; case "System.Guid": return $"substr(cast({getExp(callExp.Arguments[0])} as char), 1, 36)"; } - break; + return null; case "NewGuid": - break; + return null; case "Next": if (callExp.Object?.Type == typeof(Random)) return "cast(rand()*1000000000 as signed)"; - break; + return null; case "NextDouble": if (callExp.Object?.Type == typeof(Random)) return "rand()"; - break; + return null; case "Random": if (callExp.Method.DeclaringType.IsNumberType()) return "rand()"; - break; + return null; case "ToString": if (callExp.Object != null) return callExp.Arguments.Count == 0 ? $"cast({getExp(callExp.Object)} as char)" : null; - break; + return null; } var objExp = callExp.Object; diff --git a/Providers/FreeSql.Provider.Odbc/Default/OdbcExpression.cs b/Providers/FreeSql.Provider.Odbc/Default/OdbcExpression.cs index e734dfd0..fba05ba0 100644 --- a/Providers/FreeSql.Provider.Odbc/Default/OdbcExpression.cs +++ b/Providers/FreeSql.Provider.Odbc/Default/OdbcExpression.cs @@ -73,25 +73,25 @@ namespace FreeSql.Odbc.Default case "System.UInt64": return _utils.Adapter.LambdaConvert_ToUInt64(callExp.Method.DeclaringType, getExp(callExp.Arguments[0])); case "System.Guid": return _utils.Adapter.LambdaConvert_ToGuid(callExp.Method.DeclaringType, getExp(callExp.Arguments[0])); } - break; + return null; case "NewGuid": switch (callExp.Method.DeclaringType.NullableTypeOrThis().ToString()) { case "System.Guid": return _utils.Adapter.LambdaGuid_NewGuid; } - break; + return null; case "Next": if (callExp.Object?.Type == typeof(Random)) return _utils.Adapter.LambdaRandom_Next; - break; + return null; case "NextDouble": if (callExp.Object?.Type == typeof(Random)) return _utils.Adapter.LambdaRandom_NextDouble; - break; + return null; case "Random": if (callExp.Method.DeclaringType.IsNumberType()) return _utils.Adapter.LambdaRandom_NextDouble; - break; + return null; case "ToString": if (callExp.Object != null) return callExp.Arguments.Count == 0 ? _utils.Adapter.LambdaConvert_ToString(callExp.Object.Type, getExp(callExp.Object)) : null; - break; + return null; } var objExp = callExp.Object; diff --git a/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlExpression.cs b/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlExpression.cs index 7388e72a..5201379c 100644 --- a/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlExpression.cs +++ b/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlExpression.cs @@ -70,21 +70,21 @@ namespace FreeSql.Odbc.MySql case "System.UInt64": return $"cast({getExp(callExp.Arguments[0])} as unsigned)"; case "System.Guid": return $"substr(cast({getExp(callExp.Arguments[0])} as char), 1, 36)"; } - break; + return null; case "NewGuid": - break; + return null; case "Next": if (callExp.Object?.Type == typeof(Random)) return "cast(rand()*1000000000 as signed)"; - break; + return null; case "NextDouble": if (callExp.Object?.Type == typeof(Random)) return "rand()"; - break; + return null; case "Random": if (callExp.Method.DeclaringType.IsNumberType()) return "rand()"; - break; + return null; case "ToString": if (callExp.Object != null) return callExp.Arguments.Count == 0 ? $"cast({getExp(callExp.Object)} as char)" : null; - break; + return null; } var objExp = callExp.Object; diff --git a/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleExpression.cs b/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleExpression.cs index da39f52d..dbb94fdd 100644 --- a/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleExpression.cs +++ b/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleExpression.cs @@ -70,21 +70,21 @@ namespace FreeSql.Odbc.Oracle case "System.UInt64": return $"cast({getExp(callExp.Arguments[0])} as number)"; case "System.Guid": return $"substr(to_char({getExp(callExp.Arguments[0])}), 1, 36)"; } - break; + return null; case "NewGuid": - break; + return null; case "Next": if (callExp.Object?.Type == typeof(Random)) return "cast(dbms_random.value*1000000000 as smallint)"; - break; + return null; case "NextDouble": if (callExp.Object?.Type == typeof(Random)) return "dbms_random.value"; - break; + return null; case "Random": if (callExp.Method.DeclaringType.IsNumberType()) return "dbms_random.value"; - break; + return null; case "ToString": if (callExp.Object != null) return callExp.Arguments.Count == 0 ? $"to_char({getExp(callExp.Object)})" : null; - break; + return null; } var objExp = callExp.Object; diff --git a/Providers/FreeSql.Provider.Odbc/PostgreSQL/OdbcPostgreSQLExpression.cs b/Providers/FreeSql.Provider.Odbc/PostgreSQL/OdbcPostgreSQLExpression.cs index b9a0b56e..3d593394 100644 --- a/Providers/FreeSql.Provider.Odbc/PostgreSQL/OdbcPostgreSQLExpression.cs +++ b/Providers/FreeSql.Provider.Odbc/PostgreSQL/OdbcPostgreSQLExpression.cs @@ -76,19 +76,19 @@ namespace FreeSql.Odbc.PostgreSQL } break; case "NewGuid": - break; + return null; case "Next": if (callExp.Object?.Type == typeof(Random)) return "(random()*1000000000)::int4"; - break; + return null; case "NextDouble": if (callExp.Object?.Type == typeof(Random)) return "random()"; - break; + return null; case "Random": if (callExp.Method.DeclaringType.IsNumberType()) return "random()"; - break; + return null; case "ToString": if (callExp.Object != null) return callExp.Arguments.Count == 0 ? $"({getExp(callExp.Object)})::varchar" : null; - break; + return null; } var objExp = callExp.Object; diff --git a/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerExpression.cs b/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerExpression.cs index 41e40119..e44aa42d 100644 --- a/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerExpression.cs +++ b/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerExpression.cs @@ -70,25 +70,25 @@ namespace FreeSql.Odbc.SqlServer case "System.UInt64": return $"cast({getExp(callExp.Arguments[0])} as bigint)"; case "System.Guid": return $"cast({getExp(callExp.Arguments[0])} as uniqueidentifier)"; } - break; + return null; case "NewGuid": switch (callExp.Method.DeclaringType.NullableTypeOrThis().ToString()) { case "System.Guid": return $"newid()"; } - break; + return null; case "Next": if (callExp.Object?.Type == typeof(Random)) return "cast(rand()*1000000000 as int)"; - break; + return null; case "NextDouble": if (callExp.Object?.Type == typeof(Random)) return "rand()"; - break; + return null; case "Random": if (callExp.Method.DeclaringType.IsNumberType()) return "rand()"; - break; + return null; case "ToString": if (callExp.Object != null) return callExp.Arguments.Count == 0 ? (callExp.Object.Type.NullableTypeOrThis() == typeof(Guid) ? $"cast({getExp(callExp.Object)} as varchar(36))" : $"cast({getExp(callExp.Object)} as nvarchar)") : null; - break; + return null; } var objExp = callExp.Object; diff --git a/Providers/FreeSql.Provider.Oracle/OracleExpression.cs b/Providers/FreeSql.Provider.Oracle/OracleExpression.cs index 7dbc44e7..4642c1c1 100644 --- a/Providers/FreeSql.Provider.Oracle/OracleExpression.cs +++ b/Providers/FreeSql.Provider.Oracle/OracleExpression.cs @@ -70,21 +70,21 @@ namespace FreeSql.Oracle case "System.UInt64": return $"cast({getExp(callExp.Arguments[0])} as number)"; case "System.Guid": return $"substr(to_char({getExp(callExp.Arguments[0])}), 1, 36)"; } - break; + return null; case "NewGuid": - break; + return null; case "Next": if (callExp.Object?.Type == typeof(Random)) return "cast(dbms_random.value*1000000000 as smallint)"; - break; + return null; case "NextDouble": if (callExp.Object?.Type == typeof(Random)) return "dbms_random.value"; - break; + return null; case "Random": if (callExp.Method.DeclaringType.IsNumberType()) return "dbms_random.value"; - break; + return null; case "ToString": if (callExp.Object != null) return callExp.Arguments.Count == 0 ? $"to_char({getExp(callExp.Object)})" : null; - break; + return null; } var objExp = callExp.Object; diff --git a/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLExpression.cs b/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLExpression.cs index 7996dca4..c4845638 100644 --- a/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLExpression.cs +++ b/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLExpression.cs @@ -77,19 +77,19 @@ namespace FreeSql.PostgreSQL } break; case "NewGuid": - break; + return null; case "Next": if (callExp.Object?.Type == typeof(Random)) return "(random()*1000000000)::int4"; - break; + return null; case "NextDouble": if (callExp.Object?.Type == typeof(Random)) return "random()"; - break; + return null; case "Random": if (callExp.Method.DeclaringType.IsNumberType()) return "random()"; - break; + return null; case "ToString": if (callExp.Object != null) return callExp.Arguments.Count == 0 ? $"({getExp(callExp.Object)})::varchar" : null; - break; + return null; } var objExp = callExp.Object; diff --git a/Providers/FreeSql.Provider.SqlServer/SqlServerExpression.cs b/Providers/FreeSql.Provider.SqlServer/SqlServerExpression.cs index d8f61bc3..58e9c669 100644 --- a/Providers/FreeSql.Provider.SqlServer/SqlServerExpression.cs +++ b/Providers/FreeSql.Provider.SqlServer/SqlServerExpression.cs @@ -70,25 +70,25 @@ namespace FreeSql.SqlServer case "System.UInt64": return $"cast({getExp(callExp.Arguments[0])} as bigint)"; case "System.Guid": return $"cast({getExp(callExp.Arguments[0])} as uniqueidentifier)"; } - break; + return null; case "NewGuid": switch (callExp.Method.DeclaringType.NullableTypeOrThis().ToString()) { case "System.Guid": return $"newid()"; } - break; + return null; case "Next": if (callExp.Object?.Type == typeof(Random)) return "cast(rand()*1000000000 as int)"; - break; + return null; case "NextDouble": if (callExp.Object?.Type == typeof(Random)) return "rand()"; - break; + return null; case "Random": if (callExp.Method.DeclaringType.IsNumberType()) return "rand()"; - break; + return null; case "ToString": if (callExp.Object != null) return callExp.Arguments.Count == 0 ? (callExp.Object.Type.NullableTypeOrThis() == typeof(Guid) ? $"cast({getExp(callExp.Object)} as varchar(36))" : $"cast({getExp(callExp.Object)} as nvarchar)") : null; - break; + return null; } var objExp = callExp.Object; diff --git a/Providers/FreeSql.Provider.Sqlite/SqliteExpression.cs b/Providers/FreeSql.Provider.Sqlite/SqliteExpression.cs index 68f8cea6..81108e95 100644 --- a/Providers/FreeSql.Provider.Sqlite/SqliteExpression.cs +++ b/Providers/FreeSql.Provider.Sqlite/SqliteExpression.cs @@ -70,21 +70,21 @@ namespace FreeSql.Sqlite case "System.UInt64": return $"cast({getExp(callExp.Arguments[0])} as decimal(21,0))"; case "System.Guid": return $"substr(cast({getExp(callExp.Arguments[0])} as character), 1, 36)"; } - break; + return null; case "NewGuid": - break; + return null; case "Next": if (callExp.Object?.Type == typeof(Random)) return "cast(random()*1000000000 as int)"; - break; + return null; case "NextDouble": if (callExp.Object?.Type == typeof(Random)) return "random()"; - break; + return null; case "Random": if (callExp.Method.DeclaringType.IsNumberType()) return "random()"; - break; + return null; case "ToString": if (callExp.Object != null) return callExp.Arguments.Count == 0 ? $"cast({getExp(callExp.Object)} as character)" : null; - break; + return null; } var objExp = callExp.Object;