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;