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;