diff --git a/FreeSql/Extensions/LambadaExpressionExtensions.cs b/FreeSql/Extensions/LambadaExpressionExtensions.cs index c55ae9e8c..fd6c4f26c 100644 --- a/FreeSql/Extensions/LambadaExpressionExtensions.cs +++ b/FreeSql/Extensions/LambadaExpressionExtensions.cs @@ -248,6 +248,13 @@ namespace System.Linq.Expressions return test.Result; } + public static bool IsReadonlySpanOp_Implicit(this Expression exp) + { + return exp.NodeType == ExpressionType.Call && + exp is MethodCallExpression exp3 && + exp3.Type.Name == "ReadOnlySpan`1" && exp3.Method.Name == "op_Implicit" && exp3.Arguments.Count == 1; + } + static ConcurrentDictionary> _dicTypeMethod = new ConcurrentDictionary>(); public static bool IsStringJoin(this MethodCallExpression exp, out Expression tolistObjectExpOut, out MethodInfo toListMethodOut, out LambdaExpression toListArgs0Out) { diff --git a/FreeSql/Internal/CommonExpression.cs b/FreeSql/Internal/CommonExpression.cs index 1cd8aaa38..8a45bad51 100644 --- a/FreeSql/Internal/CommonExpression.cs +++ b/FreeSql/Internal/CommonExpression.cs @@ -1137,8 +1137,7 @@ namespace FreeSql.Internal } case ExpressionType.Call: var exp3 = exp as MethodCallExpression; - if (exp3.Type.Name == "ReadOnlySpan`1" && exp3.Method.Name == "op_Implicit" && exp3.Arguments.Count == 1) - return ExpressionLambdaToSql(exp3.Arguments[0], tsc); + if (exp3.IsReadonlySpanOp_Implicit()) return ExpressionLambdaToSql(exp3.Arguments[0], tsc); if (!tsc.isNotSetMapColumnTmp) tsc.mapType = null; if (exp3.IsExpressionCall()) { diff --git a/Providers/FreeSql.Provider.Custom/PostgreSQL/CustomPostgreSQLExpression.cs b/Providers/FreeSql.Provider.Custom/PostgreSQL/CustomPostgreSQLExpression.cs index eea54ec3b..9781f46da 100644 --- a/Providers/FreeSql.Provider.Custom/PostgreSQL/CustomPostgreSQLExpression.cs +++ b/Providers/FreeSql.Provider.Custom/PostgreSQL/CustomPostgreSQLExpression.cs @@ -213,7 +213,9 @@ namespace FreeSql.Custom.PostgreSQL else args1 = $"array[{args1}]"; if (objExp != null) { - var dbinfo = _common._orm.CodeFirst.GetDbInfo(objExp.Type); + var dbinfo = _common._orm.CodeFirst.GetDbInfo( + objExp.IsReadonlySpanOp_Implicit() ? (objExp as MethodCallExpression).Arguments[0].Type : + objExp.Type); if (dbinfo != null) args1 = $"{args1}::{dbinfo.dbtype}"; } return $"({left} @> {args1})"; diff --git a/Providers/FreeSql.Provider.KingbaseES/KingbaseESExpression.cs b/Providers/FreeSql.Provider.KingbaseES/KingbaseESExpression.cs index e50773b60..f51dc01d1 100644 --- a/Providers/FreeSql.Provider.KingbaseES/KingbaseESExpression.cs +++ b/Providers/FreeSql.Provider.KingbaseES/KingbaseESExpression.cs @@ -244,7 +244,9 @@ namespace FreeSql.KingbaseES else args1 = $"array[{args1}]"; if (objExp != null) { - var dbinfo = _common._orm.CodeFirst.GetDbInfo(objExp.Type); + var dbinfo = _common._orm.CodeFirst.GetDbInfo( + objExp.IsReadonlySpanOp_Implicit() ? (objExp as MethodCallExpression).Arguments[0].Type : + objExp.Type); if (dbinfo != null) args1 = $"{args1}::{dbinfo.dbtype}"; } return $"({left} @> {args1})"; diff --git a/Providers/FreeSql.Provider.Odbc/PostgreSQL/OdbcPostgreSQLExpression.cs b/Providers/FreeSql.Provider.Odbc/PostgreSQL/OdbcPostgreSQLExpression.cs index ae133119c..4dc7ca713 100644 --- a/Providers/FreeSql.Provider.Odbc/PostgreSQL/OdbcPostgreSQLExpression.cs +++ b/Providers/FreeSql.Provider.Odbc/PostgreSQL/OdbcPostgreSQLExpression.cs @@ -213,7 +213,9 @@ namespace FreeSql.Odbc.PostgreSQL else args1 = $"array[{args1}]"; if (objExp != null) { - var dbinfo = _common._orm.CodeFirst.GetDbInfo(objExp.Type); + var dbinfo = _common._orm.CodeFirst.GetDbInfo( + objExp.IsReadonlySpanOp_Implicit() ? (objExp as MethodCallExpression).Arguments[0].Type : + objExp.Type); if (dbinfo != null) args1 = $"{args1}::{dbinfo.dbtype}"; } return $"({left} @> {args1})"; diff --git a/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLExpression.cs b/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLExpression.cs index fddc98b30..bf1d8868c 100644 --- a/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLExpression.cs +++ b/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLExpression.cs @@ -244,7 +244,9 @@ namespace FreeSql.PostgreSQL else args1 = $"array[{args1}]"; if (objExp != null) { - var dbinfo = _common._orm.CodeFirst.GetDbInfo(objExp.Type); + var dbinfo = _common._orm.CodeFirst.GetDbInfo( + objExp.IsReadonlySpanOp_Implicit() ? (objExp as MethodCallExpression).Arguments[0].Type : + objExp.Type); if (dbinfo != null) args1 = $"{args1}::{dbinfo.dbtype}"; } return $"({left} @> {args1})"; diff --git a/Providers/FreeSql.Provider.ShenTong/ShenTongExpression.cs b/Providers/FreeSql.Provider.ShenTong/ShenTongExpression.cs index 60e551464..689193eff 100644 --- a/Providers/FreeSql.Provider.ShenTong/ShenTongExpression.cs +++ b/Providers/FreeSql.Provider.ShenTong/ShenTongExpression.cs @@ -195,7 +195,9 @@ namespace FreeSql.ShenTong else args1 = $"array[{args1}]"; if (objExp != null) { - var dbinfo = _common._orm.CodeFirst.GetDbInfo(objExp.Type); + var dbinfo = _common._orm.CodeFirst.GetDbInfo( + objExp.IsReadonlySpanOp_Implicit() ? (objExp as MethodCallExpression).Arguments[0].Type : + objExp.Type); if (dbinfo != null) args1 = $"{args1}::{dbinfo.dbtype}"; } return $"({left} @> {args1})";