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;