From 5ad0fd8b75b57c1c8fb01d8c3602e08a3cc04bc0 Mon Sep 17 00:00:00 2001 From: 2881099 <2881099@qq.com> Date: Thu, 8 Aug 2024 20:30:26 +0800 Subject: [PATCH] =?UTF-8?q?-=20=E7=A7=BB=E9=99=A4=20TimeSpan=20=E8=BF=87?= =?UTF-8?q?=E5=BA=A6=20Lambda=20=E8=A7=A3=E6=9E=90=EF=BC=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- FreeSql.DbContext/FreeSql.DbContext.xml | 8 +++ FreeSql/Internal/CommonExpression.cs | 4 -- .../ClickHouseAdo/ClickHouseAdo.cs | 9 ++- .../ClickHouseExpression.cs | 66 ----------------- .../FreeSql.Provider.Custom/CustomAdapter.cs | 8 ++- .../CustomExpression.cs | 67 ----------------- .../MySql/CustomMySqlAdo/CustomMySqlAdo.cs | 5 +- .../MySql/CustomMySqlExpression.cs | 66 ----------------- .../Oracle/CustomOracleExpression.cs | 66 ----------------- .../CustomPostgreSQLAdo.cs | 5 +- .../PostgreSQL/CustomPostgreSQLExpression.cs | 66 ----------------- .../CustomSqlServerAdo/CustomSqlServerAdo.cs | 5 +- .../SqlServer/CustomSqlServerExpression.cs | 66 ----------------- .../DamengAdo/DamengAdo.cs | 4 +- .../DamengExpression.cs | 66 ----------------- .../FirebirdAdo/FirebirdAdo.cs | 9 ++- .../FirebirdExpression.cs | 66 ----------------- .../GBaseAdo/GBaseAdo.cs | 4 +- .../FreeSql.Provider.GBase/GBaseExpression.cs | 66 ----------------- .../KingbaseESAdo/KingbaseESAdo.cs | 9 ++- .../KingbaseESExpression.cs | 66 ----------------- .../MsAccessAdo/MsAccessAdo.cs | 9 ++- .../MsAccessExpression.cs | 66 ----------------- .../MySqlAdo/MySqlAdo.cs | 9 ++- .../FreeSql.Provider.MySql/MySqlExpression.cs | 66 ----------------- .../Dameng/OdbcDamengAdo/OdbcDamengAdo.cs | 4 +- .../Dameng/OdbcDamengExpression.cs | 66 ----------------- .../Default/OdbcAdapter.cs | 8 ++- .../Default/OdbcAdo/OdbcAdo.cs | 4 +- .../Default/OdbcExpression.cs | 66 ----------------- .../OdbcKingbaseESAdo/OdbcKingbaseESAdo.cs | 9 ++- .../KingbaseES/OdbcKingbaseESExpression.cs | 66 ----------------- .../MySql/OdbcMySqlAdo/OdbcMySqlAdo.cs | 9 ++- .../MySql/OdbcMySqlExpression.cs | 66 ----------------- .../Oracle/OdbcOracleAdo/OdbcOracleAdo.cs | 4 +- .../Oracle/OdbcOracleExpression.cs | 66 ----------------- .../OdbcPostgreSQLAdo/OdbcPostgreSQLAdo.cs | 9 ++- .../PostgreSQL/OdbcPostgreSQLExpression.cs | 66 ----------------- .../OdbcSqlServerAdo/OdbcSqlServerAdo.cs | 9 ++- .../SqlServer/OdbcSqlServerExpression.cs | 66 ----------------- .../OracleAdo/OracleAdo.cs | 4 +- .../OracleExpression.cs | 66 ----------------- .../PostgreSQLAdo/PostgreSQLAdo.cs | 9 ++- .../PostgreSQLExpression.cs | 66 ----------------- .../QuestDbAdo/QuestDbAdo.cs | 9 ++- .../QuestDbExpression.cs | 72 ------------------- .../ShenTongAdo/ShenTongAdo.cs | 11 ++- .../ShenTongExpression.cs | 66 ----------------- .../SqlServerAdo/SqlServerAdo.cs | 9 ++- .../SqlServerExpression.cs | 66 ----------------- .../SqliteAdo/SqliteAdo.cs | 4 +- .../SqliteExpression.cs | 66 ----------------- .../FreeSql.Provider.Xugu/XuguAdo/XuguAdo.cs | 10 +-- .../FreeSql.Provider.Xugu/XuguExpression.cs | 66 ----------------- 54 files changed, 132 insertions(+), 1791 deletions(-) diff --git a/FreeSql.DbContext/FreeSql.DbContext.xml b/FreeSql.DbContext/FreeSql.DbContext.xml index d108e7ee..394dc368 100644 --- a/FreeSql.DbContext/FreeSql.DbContext.xml +++ b/FreeSql.DbContext/FreeSql.DbContext.xml @@ -722,5 +722,13 @@ + + + 批量注入 Repository,可以参考代码自行调整 + + + + + diff --git a/FreeSql/Internal/CommonExpression.cs b/FreeSql/Internal/CommonExpression.cs index 1cab1b98..a1a32b6c 100644 --- a/FreeSql/Internal/CommonExpression.cs +++ b/FreeSql/Internal/CommonExpression.cs @@ -1157,7 +1157,6 @@ namespace FreeSql.Internal case "System.String": other3Exp = ExpressionLambdaToSqlCallString(exp3, tsc); break; case "System.Math": other3Exp = ExpressionLambdaToSqlCallMath(exp3, tsc); break; case "System.DateTime": other3Exp = ExpressionLambdaToSqlCallDateTime(exp3, tsc); break; - case "System.TimeSpan": other3Exp = ExpressionLambdaToSqlCallTimeSpan(exp3, tsc); break; case "System.Convert": other3Exp = ExpressionLambdaToSqlCallConvert(exp3, tsc); break; } if (string.IsNullOrEmpty(other3Exp) == false) return other3Exp; @@ -1756,7 +1755,6 @@ namespace FreeSql.Internal { case "System.String": extRet = ExpressionLambdaToSqlMemberAccessString(exp4, tsc); break; case "System.DateTime": extRet = ExpressionLambdaToSqlMemberAccessDateTime(exp4, tsc); break; - case "System.TimeSpan": extRet = ExpressionLambdaToSqlMemberAccessTimeSpan(exp4, tsc); break; } if (string.IsNullOrEmpty(extRet) == false) return extRet; var other4Exp = ExpressionLambdaToSqlOther(exp4, tsc); @@ -2219,11 +2217,9 @@ namespace FreeSql.Internal public abstract string ExpressionLambdaToSqlMemberAccessString(MemberExpression exp, ExpTSC tsc); public abstract string ExpressionLambdaToSqlMemberAccessDateTime(MemberExpression exp, ExpTSC tsc); - public abstract string ExpressionLambdaToSqlMemberAccessTimeSpan(MemberExpression exp, ExpTSC tsc); public abstract string ExpressionLambdaToSqlCallString(MethodCallExpression exp, ExpTSC tsc); public abstract string ExpressionLambdaToSqlCallMath(MethodCallExpression exp, ExpTSC tsc); public abstract string ExpressionLambdaToSqlCallDateTime(MethodCallExpression exp, ExpTSC tsc); - public abstract string ExpressionLambdaToSqlCallTimeSpan(MethodCallExpression exp, ExpTSC tsc); public abstract string ExpressionLambdaToSqlCallConvert(MethodCallExpression exp, ExpTSC tsc); public abstract string ExpressionLambdaToSqlOther(Expression exp, ExpTSC tsc); public string ExpressionConstDateTime(Expression exp) => exp is ConstantExpression operandExpConst ? formatSql(Utils.GetDataReaderValue(typeof(DateTime), operandExpConst.Value), null, null, null) : null; diff --git a/Providers/FreeSql.Provider.ClickHouse/ClickHouseAdo/ClickHouseAdo.cs b/Providers/FreeSql.Provider.ClickHouse/ClickHouseAdo/ClickHouseAdo.cs index aa80beb4..2bd3ebd0 100644 --- a/Providers/FreeSql.Provider.ClickHouse/ClickHouseAdo/ClickHouseAdo.cs +++ b/Providers/FreeSql.Provider.ClickHouse/ClickHouseAdo/ClickHouseAdo.cs @@ -36,8 +36,8 @@ namespace FreeSql.ClickHouse slaveConnectionStrings?.ToList().ForEach(slaveConnectionString => { var slavePool = isAdoPool ? - new DbConnectionStringPool(base.DataType, $"{CoreStrings.S_SlaveDatabase}{SlavePools.Count + 1}", () => new ClickHouseConnection(slaveConnectionString)) as IObjectPool : - new ClickHouseConnectionPool($"{CoreStrings.S_SlaveDatabase}{SlavePools.Count + 1}", slaveConnectionString, () => Interlocked.Decrement(ref slaveUnavailables), () => Interlocked.Increment(ref slaveUnavailables)); + new DbConnectionStringPool(base.DataType, $"{CoreStrings.S_SlaveDatabase}{SlavePools.Count + 1}", () => new ClickHouseConnection(slaveConnectionString)) as IObjectPool : + new ClickHouseConnectionPool($"{CoreStrings.S_SlaveDatabase}{SlavePools.Count + 1}", slaveConnectionString, () => Interlocked.Decrement(ref slaveUnavailables), () => Interlocked.Increment(ref slaveUnavailables)); SlavePools.Add(slavePool); }); } @@ -64,7 +64,10 @@ namespace FreeSql.ClickHouse return AddslashesTypeHandler(typeof(DateTime?), param) ?? string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss"), "'"); else if (param is TimeSpan || param is TimeSpan?) - return ((TimeSpan)param).Ticks / 10; + { + var ts = (TimeSpan)param; + return $"'{Math.Floor(ts.TotalHours)}:{ts.Minutes}:{ts.Seconds}'"; + } else if (param is byte[]) return $"0x{CommonUtils.BytesSqlRaw(param as byte[])}"; else if (param is IEnumerable) diff --git a/Providers/FreeSql.Provider.ClickHouse/ClickHouseExpression.cs b/Providers/FreeSql.Provider.ClickHouse/ClickHouseExpression.cs index 292bd620..1e52e21e 100644 --- a/Providers/FreeSql.Provider.ClickHouse/ClickHouseExpression.cs +++ b/Providers/FreeSql.Provider.ClickHouse/ClickHouseExpression.cs @@ -280,35 +280,6 @@ namespace FreeSql.ClickHouse return true; return DateTime.TryParse(date, out var time); } - public override string ExpressionLambdaToSqlMemberAccessTimeSpan(MemberExpression exp, ExpTSC tsc) - { - if (exp.Expression == null) - { - switch (exp.Member.Name) - { - case "Zero": return "0"; - case "MinValue": return "-922337203685477580"; //微秒 Ticks / 10 - case "MaxValue": return "922337203685477580"; - } - return null; - } - var left = ExpressionLambdaToSql(exp.Expression, tsc); - switch (exp.Member.Name) - { - case "Days": return $"intDiv(({left})/{60 * 60 * 24})"; - case "Hours": return $"intDiv(({left})/{60 * 60}%24)"; - case "Milliseconds": return $"(cast({left} as Int64)*1000)"; - case "Minutes": return $"intDiv(({left})/60%60)"; - case "Seconds": return $"(({left})%60)"; - case "Ticks": return $"(intDiv({left} as Int64)*10000000)"; - case "TotalDays": return $"(({left})/{60 * 60 * 24})"; - case "TotalHours": return $"(({left})/{60 * 60})"; - case "TotalMilliseconds": return $"(cast({left} as Int64)*1000)"; - case "TotalMinutes": return $"(({left})/60)"; - case "TotalSeconds": return $"({left})"; - } - return null; - } public override string ExpressionLambdaToSqlCallString(MethodCallExpression exp, ExpTSC tsc) { @@ -477,7 +448,6 @@ namespace FreeSql.ClickHouse var args1 = exp.Arguments.Count == 0 ? null : getExp(exp.Arguments[0]); switch (exp.Method.Name) { - case "Add": return $"addSeconds(toDateTime({left}), {args1})"; case "AddDays": return $"addDays(toDateTime({left}), {args1})"; case "AddHours": return $"addHours(toDateTime({left}), {args1})"; case "AddMilliseconds": return $"addSeconds(toDateTime({left}), {args1}/1000)"; @@ -555,42 +525,6 @@ namespace FreeSql.ClickHouse } return null; } - public override string ExpressionLambdaToSqlCallTimeSpan(MethodCallExpression exp, ExpTSC tsc) - { - Func getExp = exparg => ExpressionLambdaToSql(exparg, tsc); - if (exp.Object == null) - { - switch (exp.Method.Name) - { - case "Compare": return $"({getExp(exp.Arguments[0])}-({getExp(exp.Arguments[1])}))"; - case "Equals": return $"({getExp(exp.Arguments[0])} = {getExp(exp.Arguments[1])})"; - case "FromDays": return $"(({getExp(exp.Arguments[0])})*{(long)1000000 * 60 * 60 * 24})"; - case "FromHours": return $"(({getExp(exp.Arguments[0])})*{(long)1000000 * 60 * 60})"; - case "FromMilliseconds": return $"(({getExp(exp.Arguments[0])})*1000)"; - case "FromMinutes": return $"(({getExp(exp.Arguments[0])})*{(long)1000000 * 60})"; - case "FromSeconds": return $"(({getExp(exp.Arguments[0])})*1000000)"; - case "FromTicks": return $"(({getExp(exp.Arguments[0])})/10)"; - case "Parse": return $"cast({getExp(exp.Arguments[0])} as Int64)"; - case "ParseExact": - case "TryParse": - case "TryParseExact": return $"cast({getExp(exp.Arguments[0])} as Int64)"; - } - } - else - { - var left = getExp(exp.Object); - var args1 = exp.Arguments.Count == 0 ? null : getExp(exp.Arguments[0]); - switch (exp.Method.Name) - { - case "Add": return $"({left}+{args1})"; - case "Subtract": return $"({left}-({args1}))"; - case "Equals": return $"({left} = {args1})"; - case "CompareTo": return $"({left}-({args1}))"; - case "ToString": return $"cast({left} as String)"; - } - } - return null; - } public override string ExpressionLambdaToSqlCallConvert(MethodCallExpression exp, ExpTSC tsc) { Func getExp = exparg => ExpressionLambdaToSql(exparg, tsc); diff --git a/Providers/FreeSql.Provider.Custom/CustomAdapter.cs b/Providers/FreeSql.Provider.Custom/CustomAdapter.cs index b32c2bfc..4847109f 100644 --- a/Providers/FreeSql.Provider.Custom/CustomAdapter.cs +++ b/Providers/FreeSql.Provider.Custom/CustomAdapter.cs @@ -53,7 +53,12 @@ namespace FreeSql.Custom if (value.Equals(DateTime.MinValue) == true) value = new DateTime(1970, 1, 1); return string.Concat("'", ((DateTime)value).ToString("yyyy-MM-dd HH:mm:ss"), "'"); } - public virtual string TimeSpanRawSql(object value) => value == null ? "NULL" : ((TimeSpan)value).TotalSeconds.ToString(); + public virtual string TimeSpanRawSql(object value) + { + if (value == null) return "NULL"; + var ts = (TimeSpan)value; + return $"'{ts.Hours}:{ts.Minutes}:{ts.Seconds}.{ts.Milliseconds}'"; + } public virtual string ByteRawSql(object value) { if (value == null) return "NULL"; @@ -136,7 +141,6 @@ namespace FreeSql.Custom public virtual string LambdaDateTime_DaysInMonth(string year, string month) => $"datepart(day, dateadd(day, -1, dateadd(month, 1, cast({year} as varchar) + '-' + cast({month} as varchar) + '-1')))"; public virtual string LambdaDateTime_IsLeapYear(string year) => $"(({year})%4=0 AND ({year})%100<>0 OR ({year})%400=0)"; - public virtual string LambdaDateTime_Add(string operand, string value) => $"dateadd(second, {value}, {operand})"; public virtual string LambdaDateTime_AddDays(string operand, string value) => $"dateadd(day, {value}, {operand})"; public virtual string LambdaDateTime_AddHours(string operand, string value) => $"dateadd(hour, {value}, {operand})"; public virtual string LambdaDateTime_AddMilliseconds(string operand, string value) => $"dateadd(second, ({value})/1000, {operand})"; diff --git a/Providers/FreeSql.Provider.Custom/CustomExpression.cs b/Providers/FreeSql.Provider.Custom/CustomExpression.cs index 8e5cc1ca..e784e6d7 100644 --- a/Providers/FreeSql.Provider.Custom/CustomExpression.cs +++ b/Providers/FreeSql.Provider.Custom/CustomExpression.cs @@ -236,36 +236,6 @@ namespace FreeSql.Custom return null; } - public override string ExpressionLambdaToSqlMemberAccessTimeSpan(MemberExpression exp, ExpTSC tsc) - { - if (exp.Expression == null) - { - switch (exp.Member.Name) - { - case "Zero": return "0"; - case "MinValue": return "-922337203685477580"; //微秒 Ticks / 10 - case "MaxValue": return "922337203685477580"; - } - return null; - } - var left = ExpressionLambdaToSql(exp.Expression, tsc); - switch (exp.Member.Name) - { - case "Days": return _utils.Adapter.LambdaMath_Floor($"({left})/{60 * 60 * 24}"); - case "Hours": return _utils.Adapter.LambdaMath_Floor($"({left})/{60 * 60}%24"); - case "Milliseconds": return $"({_utils.Adapter.CastSql(left, _utils.Adapter.MappingDbTypeBigInt)}*1000)"; - case "Minutes": return _utils.Adapter.LambdaMath_Floor($"({left})/60%60"); - case "Seconds": return $"(({left})%60)"; - case "Ticks": return $"({_utils.Adapter.CastSql(left, _utils.Adapter.MappingDbTypeBigInt)}*10000000)"; - case "TotalDays": return $"(({left})/{60 * 60 * 24})"; - case "TotalHours": return $"(({left})/{60 * 60})"; - case "TotalMilliseconds": return $"({_utils.Adapter.CastSql(left, _utils.Adapter.MappingDbTypeBigInt)}*1000)"; - case "TotalMinutes": return $"(({left})/60)"; - case "TotalSeconds": return $"({left})"; - } - return null; - } - public override string ExpressionLambdaToSqlCallString(MethodCallExpression exp, ExpTSC tsc) { Func getExp = exparg => ExpressionLambdaToSql(exparg, tsc); @@ -382,7 +352,6 @@ namespace FreeSql.Custom var args1 = exp.Arguments.Count == 0 ? null : getExp(exp.Arguments[0]); switch (exp.Method.Name) { - case "Add": return _utils.Adapter.LambdaDateTime_Add(left, args1); case "AddDays": return _utils.Adapter.LambdaDateTime_AddDays(left, args1); case "AddHours": return _utils.Adapter.LambdaDateTime_AddHours(left, args1); case "AddMilliseconds": return _utils.Adapter.LambdaDateTime_AddMilliseconds(left, args1); @@ -411,42 +380,6 @@ namespace FreeSql.Custom public virtual string LambdaDateSpan_Equals(string oldvalue, string newvalue) => $"({oldvalue} = {newvalue})"; public virtual string LambdaDateSpan_CompareTo(string oldvalue, string newvalue) => $"({oldvalue}-({newvalue}))"; - public override string ExpressionLambdaToSqlCallTimeSpan(MethodCallExpression exp, ExpTSC tsc) - { - Func getExp = exparg => ExpressionLambdaToSql(exparg, tsc); - if (exp.Object == null) - { - switch (exp.Method.Name) - { - case "Compare": return $"({getExp(exp.Arguments[0])}-({getExp(exp.Arguments[1])}))"; - case "Equals": return $"({getExp(exp.Arguments[0])} = {getExp(exp.Arguments[1])})"; - case "FromDays": return $"(({getExp(exp.Arguments[0])})*{60 * 60 * 24})"; - case "FromHours": return $"(({getExp(exp.Arguments[0])})*{60 * 60})"; - case "FromMilliseconds": return $"(({getExp(exp.Arguments[0])})/1000)"; - case "FromMinutes": return $"(({getExp(exp.Arguments[0])})*60)"; - case "FromSeconds": return $"({getExp(exp.Arguments[0])})"; - case "FromTicks": return $"(({getExp(exp.Arguments[0])})/10000000)"; - case "Parse": return _utils.Adapter.LambdaConvert_ToInt64(exp.Arguments[0].Type, getExp(exp.Arguments[0])); - case "ParseExact": - case "TryParse": - case "TryParseExact": return _utils.Adapter.LambdaConvert_ToInt64(exp.Arguments[0].Type, getExp(exp.Arguments[0])); - } - } - else - { - var left = getExp(exp.Object); - var args1 = exp.Arguments.Count == 0 ? null : getExp(exp.Arguments[0]); - switch (exp.Method.Name) - { - case "Add": return $"({left}+{args1})"; - case "Subtract": return $"({left}-({args1}))"; - case "Equals": return $"({left} = {args1})"; - case "CompareTo": return $"({left}-({args1}))"; - case "ToString": return _utils.Adapter.LambdaConvert_ToString(exp.Type, left); - } - } - return null; - } public override string ExpressionLambdaToSqlCallConvert(MethodCallExpression exp, ExpTSC tsc) { Func getExp = exparg => ExpressionLambdaToSql(exparg, tsc); diff --git a/Providers/FreeSql.Provider.Custom/MySql/CustomMySqlAdo/CustomMySqlAdo.cs b/Providers/FreeSql.Provider.Custom/MySql/CustomMySqlAdo/CustomMySqlAdo.cs index 44c295fa..21f794f3 100644 --- a/Providers/FreeSql.Provider.Custom/MySql/CustomMySqlAdo/CustomMySqlAdo.cs +++ b/Providers/FreeSql.Provider.Custom/MySql/CustomMySqlAdo/CustomMySqlAdo.cs @@ -49,7 +49,10 @@ namespace FreeSql.Custom.MySql return AddslashesTypeHandler(typeof(DateTime?), param) ?? string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.fff"), "'"); else if (param is TimeSpan || param is TimeSpan?) - return ((TimeSpan)param).Ticks / 10; + { + var ts = (TimeSpan)param; + return $"'{Math.Floor(ts.TotalHours)}:{ts.Minutes}:{ts.Seconds}'"; + } else if (param is byte[]) return $"0x{CommonUtils.BytesSqlRaw(param as byte[])}"; else if (param is IEnumerable) diff --git a/Providers/FreeSql.Provider.Custom/MySql/CustomMySqlExpression.cs b/Providers/FreeSql.Provider.Custom/MySql/CustomMySqlExpression.cs index fee89ee6..ba644669 100644 --- a/Providers/FreeSql.Provider.Custom/MySql/CustomMySqlExpression.cs +++ b/Providers/FreeSql.Provider.Custom/MySql/CustomMySqlExpression.cs @@ -231,35 +231,6 @@ namespace FreeSql.Custom.MySql } return null; } - public override string ExpressionLambdaToSqlMemberAccessTimeSpan(MemberExpression exp, ExpTSC tsc) - { - if (exp.Expression == null) - { - switch (exp.Member.Name) - { - case "Zero": return "0"; - case "MinValue": return "-922337203685477580"; //微秒 Ticks / 10 - case "MaxValue": return "922337203685477580"; - } - return null; - } - var left = ExpressionLambdaToSql(exp.Expression, tsc); - switch (exp.Member.Name) - { - case "Days": return $"(({left}) div {(long)1000000 * 60 * 60 * 24})"; - case "Hours": return $"(({left}) div {(long)1000000 * 60 * 60} mod 24)"; - case "Milliseconds": return $"(({left}) div 1000 mod 1000)"; - case "Minutes": return $"(({left}) div {(long)1000000 * 60} mod 60)"; - case "Seconds": return $"(({left}) div 1000000 mod 60)"; - case "Ticks": return $"(({left}) * 10)"; - case "TotalDays": return $"(({left}) / {(long)1000000 * 60 * 60 * 24})"; - case "TotalHours": return $"(({left}) / {(long)1000000 * 60 * 60})"; - case "TotalMilliseconds": return $"(({left}) / 1000)"; - case "TotalMinutes": return $"(({left}) / {(long)1000000 * 60})"; - case "TotalSeconds": return $"(({left}) / 1000000)"; - } - return null; - } public override string ExpressionLambdaToSqlCallString(MethodCallExpression exp, ExpTSC tsc) { @@ -434,7 +405,6 @@ namespace FreeSql.Custom.MySql var args1 = exp.Arguments.Count == 0 ? null : getExp(exp.Arguments[0]); switch (exp.Method.Name) { - case "Add": return $"date_add({left}, interval ({args1}) microsecond)"; case "AddDays": return $"date_add({left}, interval ({args1}) day)"; case "AddHours": return $"date_add({left}, interval ({args1}) hour)"; case "AddMilliseconds": return $"date_add({left}, interval ({args1})*1000 microsecond)"; @@ -512,42 +482,6 @@ namespace FreeSql.Custom.MySql } return null; } - public override string ExpressionLambdaToSqlCallTimeSpan(MethodCallExpression exp, ExpTSC tsc) - { - Func getExp = exparg => ExpressionLambdaToSql(exparg, tsc); - if (exp.Object == null) - { - switch (exp.Method.Name) - { - case "Compare": return $"({getExp(exp.Arguments[0])}-({getExp(exp.Arguments[1])}))"; - case "Equals": return $"({getExp(exp.Arguments[0])} = {getExp(exp.Arguments[1])})"; - case "FromDays": return $"(({getExp(exp.Arguments[0])})*{(long)1000000 * 60 * 60 * 24})"; - case "FromHours": return $"(({getExp(exp.Arguments[0])})*{(long)1000000 * 60 * 60})"; - case "FromMilliseconds": return $"(({getExp(exp.Arguments[0])})*1000)"; - case "FromMinutes": return $"(({getExp(exp.Arguments[0])})*{(long)1000000 * 60})"; - case "FromSeconds": return $"(({getExp(exp.Arguments[0])})*1000000)"; - case "FromTicks": return $"(({getExp(exp.Arguments[0])})/10)"; - case "Parse": return $"cast({getExp(exp.Arguments[0])} as signed)"; - case "ParseExact": - case "TryParse": - case "TryParseExact": return $"cast({getExp(exp.Arguments[0])} as signed)"; - } - } - else - { - var left = getExp(exp.Object); - var args1 = exp.Arguments.Count == 0 ? null : getExp(exp.Arguments[0]); - switch (exp.Method.Name) - { - case "Add": return $"({left}+{args1})"; - case "Subtract": return $"({left}-({args1}))"; - case "Equals": return $"({left} = {args1})"; - case "CompareTo": return $"({left}-({args1}))"; - case "ToString": return $"cast({left} as char)"; - } - } - return null; - } public override string ExpressionLambdaToSqlCallConvert(MethodCallExpression exp, ExpTSC tsc) { Func getExp = exparg => ExpressionLambdaToSql(exparg, tsc); diff --git a/Providers/FreeSql.Provider.Custom/Oracle/CustomOracleExpression.cs b/Providers/FreeSql.Provider.Custom/Oracle/CustomOracleExpression.cs index 17c95218..529507dd 100644 --- a/Providers/FreeSql.Provider.Custom/Oracle/CustomOracleExpression.cs +++ b/Providers/FreeSql.Provider.Custom/Oracle/CustomOracleExpression.cs @@ -235,35 +235,6 @@ namespace FreeSql.Custom.Oracle } return null; } - public override string ExpressionLambdaToSqlMemberAccessTimeSpan(MemberExpression exp, ExpTSC tsc) - { - if (exp.Expression == null) - { - switch (exp.Member.Name) - { - case "Zero": return "numtodsinterval(0,'second')"; - case "MinValue": return "numtodsinterval(-233720368.5477580,'second')"; - case "MaxValue": return "numtodsinterval(233720368.5477580,'second')"; - } - return null; - } - var left = ExpressionLambdaToSql(exp.Expression, tsc); - switch (exp.Member.Name) - { - case "Days": return $"extract(day from {left})"; - case "Hours": return $"extract(hour from {left})"; - case "Milliseconds": return $"cast(substr(extract(second from {left})-floor(extract(second from {left})),3,3) as number)"; - case "Minutes": return $"extract(minute from {left})"; - case "Seconds": return $"floor(extract(second from {left}))"; - case "Ticks": return $"(extract(day from {left})*86400+extract(hour from {left})*3600+extract(minute from {left})*60+extract(second from {left}))*10000000"; - case "TotalDays": return $"extract(day from {left})"; - case "TotalHours": return $"(extract(day from {left})*24+extract(hour from {left}))"; - case "TotalMilliseconds": return $"(extract(day from {left})*86400+extract(hour from {left})*3600+extract(minute from {left})*60+extract(second from {left}))*1000"; - case "TotalMinutes": return $"(extract(day from {left})*1440+extract(hour from {left})*60+extract(minute from {left}))"; - case "TotalSeconds": return $"(extract(day from {left})*86400+extract(hour from {left})*3600+extract(minute from {left})*60+extract(second from {left}))"; - } - return null; - } public override string ExpressionLambdaToSqlCallString(MethodCallExpression exp, ExpTSC tsc) { @@ -439,7 +410,6 @@ namespace FreeSql.Custom.Oracle var args1 = exp.Arguments.Count == 0 ? null : getExp(exp.Arguments[0]); switch (exp.Method.Name) { - case "Add": return $"({left}+{args1})"; case "AddDays": return $"({left}+{args1})"; case "AddHours": return $"({left}+({args1})/24)"; case "AddMilliseconds": return $"({left}+({args1})/86400000)"; @@ -518,42 +488,6 @@ namespace FreeSql.Custom.Oracle } return null; } - public override string ExpressionLambdaToSqlCallTimeSpan(MethodCallExpression exp, ExpTSC tsc) - { - Func getExp = exparg => ExpressionLambdaToSql(exparg, tsc); - if (exp.Object == null) - { - switch (exp.Method.Name) - { - case "Compare": return $"extract(day from ({getExp(exp.Arguments[0])}-({getExp(exp.Arguments[1])})))"; - case "Equals": return $"({getExp(exp.Arguments[0])} = {getExp(exp.Arguments[1])})"; - case "FromDays": return $"numtodsinterval(({getExp(exp.Arguments[0])})*{(long)60 * 60 * 24},'second')"; - case "FromHours": return $"numtodsinterval(({getExp(exp.Arguments[0])})*{(long)60 * 60},'second')"; - case "FromMilliseconds": return $"numtodsinterval(({getExp(exp.Arguments[0])})/1000,'second')"; - case "FromMinutes": return $"numtodsinterval(({getExp(exp.Arguments[0])})*60,'second')"; - case "FromSeconds": return $"numtodsinterval(({getExp(exp.Arguments[0])}),'second')"; - case "FromTicks": return $"numtodsinterval(({getExp(exp.Arguments[0])})/10000000,'second')"; - case "Parse": return $"cast({getExp(exp.Arguments[0])} as interval day(9) to second(7))"; - case "ParseExact": - case "TryParse": - case "TryParseExact": return $"cast({getExp(exp.Arguments[0])} as interval day(9) to second(7))"; - } - } - else - { - var left = getExp(exp.Object); - var args1 = exp.Arguments.Count == 0 ? null : getExp(exp.Arguments[0]); - switch (exp.Method.Name) - { - case "Add": return $"({left}+{args1})"; - case "Subtract": return $"({left}-({args1}))"; - case "Equals": return $"({left} = {args1})"; - case "CompareTo": return $"extract(day from ({left}-({args1})))"; - case "ToString": return $"to_char({left})"; - } - } - return null; - } public override string ExpressionLambdaToSqlCallConvert(MethodCallExpression exp, ExpTSC tsc) { Func getExp = exparg => ExpressionLambdaToSql(exparg, tsc); diff --git a/Providers/FreeSql.Provider.Custom/PostgreSQL/CustomPostgreSQLAdo/CustomPostgreSQLAdo.cs b/Providers/FreeSql.Provider.Custom/PostgreSQL/CustomPostgreSQLAdo/CustomPostgreSQLAdo.cs index d8c11269..47c2c3c9 100644 --- a/Providers/FreeSql.Provider.Custom/PostgreSQL/CustomPostgreSQLAdo/CustomPostgreSQLAdo.cs +++ b/Providers/FreeSql.Provider.Custom/PostgreSQL/CustomPostgreSQLAdo/CustomPostgreSQLAdo.cs @@ -51,7 +51,10 @@ namespace FreeSql.Custom.PostgreSQL return AddslashesTypeHandler(typeof(DateTime?), param) ?? string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.ffffff"), "'"); else if (param is TimeSpan || param is TimeSpan?) - return ((TimeSpan)param).Ticks / 10; + { + var ts = (TimeSpan)param; + return $"'{Math.Min(24, (int)Math.Floor(ts.TotalHours))}:{ts.Minutes}:{ts.Seconds}'"; + } else if (param is byte[]) return $"'\\x{CommonUtils.BytesSqlRaw(param as byte[])}'"; else if (param is IEnumerable) diff --git a/Providers/FreeSql.Provider.Custom/PostgreSQL/CustomPostgreSQLExpression.cs b/Providers/FreeSql.Provider.Custom/PostgreSQL/CustomPostgreSQLExpression.cs index 5e010701..73395ee7 100644 --- a/Providers/FreeSql.Provider.Custom/PostgreSQL/CustomPostgreSQLExpression.cs +++ b/Providers/FreeSql.Provider.Custom/PostgreSQL/CustomPostgreSQLExpression.cs @@ -319,35 +319,6 @@ namespace FreeSql.Custom.PostgreSQL } return null; } - public override string ExpressionLambdaToSqlMemberAccessTimeSpan(MemberExpression exp, ExpTSC tsc) - { - if (exp.Expression == null) - { - switch (exp.Member.Name) - { - case "Zero": return "0"; - case "MinValue": return "-922337203685477580"; //微秒 Ticks / 10 - case "MaxValue": return "922337203685477580"; - } - return null; - } - var left = ExpressionLambdaToSql(exp.Expression, tsc); - switch (exp.Member.Name) - { - case "Days": return $"floor(({left})/{(long)1000000 * 60 * 60 * 24})"; - case "Hours": return $"floor(({left})/{(long)1000000 * 60 * 60}%24)"; - case "Milliseconds": return $"(floor(({left})/1000)::int8%1000)"; - case "Minutes": return $"(floor(({left})/{(long)1000000 * 60})::int8%60)"; - case "Seconds": return $"(floor(({left})/1000000)::int8%60)"; - case "Ticks": return $"(({left})*10)"; - case "TotalDays": return $"(({left})/{(long)1000000 * 60 * 60 * 24})"; - case "TotalHours": return $"(({left})/{(long)1000000 * 60 * 60})"; - case "TotalMilliseconds": return $"(({left})/1000)"; - case "TotalMinutes": return $"(({left})/{(long)1000000 * 60})"; - case "TotalSeconds": return $"(({left})/1000000)"; - } - return null; - } public override string ExpressionLambdaToSqlCallString(MethodCallExpression exp, ExpTSC tsc) { @@ -528,7 +499,6 @@ namespace FreeSql.Custom.PostgreSQL var args1 = exp.Arguments.Count == 0 ? null : getExp(exp.Arguments[0]); switch (exp.Method.Name) { - case "Add": return $"(({left})::timestamp+((({args1})/1000)||' milliseconds')::interval)"; case "AddDays": return $"(({left})::timestamp+(({args1})||' day')::interval)"; case "AddHours": return $"(({left})::timestamp+(({args1})||' hour')::interval)"; case "AddMilliseconds": return $"(({left})::timestamp+(({args1})||' milliseconds')::interval)"; @@ -607,42 +577,6 @@ namespace FreeSql.Custom.PostgreSQL } return null; } - public override string ExpressionLambdaToSqlCallTimeSpan(MethodCallExpression exp, ExpTSC tsc) - { - Func getExp = exparg => ExpressionLambdaToSql(exparg, tsc); - if (exp.Object == null) - { - switch (exp.Method.Name) - { - case "Compare": return $"({getExp(exp.Arguments[0])}-({getExp(exp.Arguments[1])}))"; - case "Equals": return $"({getExp(exp.Arguments[0])} = {getExp(exp.Arguments[1])})"; - case "FromDays": return $"(({getExp(exp.Arguments[0])})*{(long)1000000 * 60 * 60 * 24})"; - case "FromHours": return $"(({getExp(exp.Arguments[0])})*{(long)1000000 * 60 * 60})"; - case "FromMilliseconds": return $"(({getExp(exp.Arguments[0])})*1000)"; - case "FromMinutes": return $"(({getExp(exp.Arguments[0])})*{(long)1000000 * 60})"; - case "FromSeconds": return $"(({getExp(exp.Arguments[0])})*1000000)"; - case "FromTicks": return $"(({getExp(exp.Arguments[0])})/10)"; - case "Parse": return $"({getExp(exp.Arguments[0])})::int8"; - case "ParseExact": - case "TryParse": - case "TryParseExact": return $"({getExp(exp.Arguments[0])})::int8"; - } - } - else - { - var left = getExp(exp.Object); - var args1 = exp.Arguments.Count == 0 ? null : getExp(exp.Arguments[0]); - switch (exp.Method.Name) - { - case "Add": return $"({left}+{args1})"; - case "Subtract": return $"({left}-({args1}))"; - case "Equals": return $"({left} = {args1})"; - case "CompareTo": return $"({left}-({args1}))"; - case "ToString": return $"({left})::varchar"; - } - } - return null; - } public override string ExpressionLambdaToSqlCallConvert(MethodCallExpression exp, ExpTSC tsc) { Func getExp = exparg => ExpressionLambdaToSql(exparg, tsc); diff --git a/Providers/FreeSql.Provider.Custom/SqlServer/CustomSqlServerAdo/CustomSqlServerAdo.cs b/Providers/FreeSql.Provider.Custom/SqlServer/CustomSqlServerAdo/CustomSqlServerAdo.cs index 74000096..72129f25 100644 --- a/Providers/FreeSql.Provider.Custom/SqlServer/CustomSqlServerAdo/CustomSqlServerAdo.cs +++ b/Providers/FreeSql.Provider.Custom/SqlServer/CustomSqlServerAdo/CustomSqlServerAdo.cs @@ -71,7 +71,10 @@ namespace FreeSql.Custom.SqlServer return string.Concat("'", ((DateTimeOffset)param).ToString("yyyy-MM-dd HH:mm:ss.fff zzzz"), "'"); } else if (param is TimeSpan || param is TimeSpan?) - return ((TimeSpan)param).TotalSeconds; + { + var ts = (TimeSpan)param; + return $"'{ts.Hours}:{ts.Minutes}:{ts.Seconds}.{ts.Milliseconds}'"; + } else if (param is byte[]) return $"0x{CommonUtils.BytesSqlRaw(param as byte[])}"; else if (param is IEnumerable) diff --git a/Providers/FreeSql.Provider.Custom/SqlServer/CustomSqlServerExpression.cs b/Providers/FreeSql.Provider.Custom/SqlServer/CustomSqlServerExpression.cs index bf123910..c35a139c 100644 --- a/Providers/FreeSql.Provider.Custom/SqlServer/CustomSqlServerExpression.cs +++ b/Providers/FreeSql.Provider.Custom/SqlServer/CustomSqlServerExpression.cs @@ -241,35 +241,6 @@ namespace FreeSql.Custom.SqlServer } return null; } - public override string ExpressionLambdaToSqlMemberAccessTimeSpan(MemberExpression exp, ExpTSC tsc) - { - if (exp.Expression == null) - { - switch (exp.Member.Name) - { - case "Zero": return "0"; - case "MinValue": return "-922337203685477580"; //微秒 Ticks / 10 - case "MaxValue": return "922337203685477580"; - } - return null; - } - var left = ExpressionLambdaToSql(exp.Expression, tsc); - switch (exp.Member.Name) - { - case "Days": return $"floor(({left})/{60 * 60 * 24})"; - case "Hours": return $"floor(({left})/{60 * 60}%24)"; - case "Milliseconds": return $"(cast({left} as bigint)*1000)"; - case "Minutes": return $"floor(({left})/60%60)"; - case "Seconds": return $"(({left})%60)"; - case "Ticks": return $"(cast({left} as bigint)*10000000)"; - case "TotalDays": return $"(({left})/{60 * 60 * 24})"; - case "TotalHours": return $"(({left})/{60 * 60})"; - case "TotalMilliseconds": return $"(cast({left} as bigint)*1000)"; - case "TotalMinutes": return $"(({left})/60)"; - case "TotalSeconds": return $"({left})"; - } - return null; - } public override string ExpressionLambdaToSqlCallString(MethodCallExpression exp, ExpTSC tsc) { @@ -435,7 +406,6 @@ namespace FreeSql.Custom.SqlServer var args1 = exp.Arguments.Count == 0 ? null : getExp(exp.Arguments[0]); switch (exp.Method.Name) { - case "Add": return $"dateadd(second, {args1}, {left})"; case "AddDays": return $"dateadd(day, {args1}, {left})"; case "AddHours": return $"dateadd(hour, {args1}, {left})"; case "AddMilliseconds": return $"dateadd(second, ({args1})/1000, {left})"; @@ -503,42 +473,6 @@ namespace FreeSql.Custom.SqlServer } return null; } - public override string ExpressionLambdaToSqlCallTimeSpan(MethodCallExpression exp, ExpTSC tsc) - { - Func getExp = exparg => ExpressionLambdaToSql(exparg, tsc); - if (exp.Object == null) - { - switch (exp.Method.Name) - { - case "Compare": return $"({getExp(exp.Arguments[0])}-({getExp(exp.Arguments[1])}))"; - case "Equals": return $"({getExp(exp.Arguments[0])} = {getExp(exp.Arguments[1])})"; - case "FromDays": return $"(({getExp(exp.Arguments[0])})*{60 * 60 * 24})"; - case "FromHours": return $"(({getExp(exp.Arguments[0])})*{60 * 60})"; - case "FromMilliseconds": return $"(({getExp(exp.Arguments[0])})/1000)"; - case "FromMinutes": return $"(({getExp(exp.Arguments[0])})*60)"; - case "FromSeconds": return $"({getExp(exp.Arguments[0])})"; - case "FromTicks": return $"(({getExp(exp.Arguments[0])})/10000000)"; - case "Parse": return $"cast({getExp(exp.Arguments[0])} as bigint)"; - case "ParseExact": - case "TryParse": - case "TryParseExact": return $"cast({getExp(exp.Arguments[0])} as bigint)"; - } - } - else - { - var left = getExp(exp.Object); - var args1 = exp.Arguments.Count == 0 ? null : getExp(exp.Arguments[0]); - switch (exp.Method.Name) - { - case "Add": return $"({left}+{args1})"; - case "Subtract": return $"({left}-({args1}))"; - case "Equals": return $"({left} = {args1})"; - case "CompareTo": return $"({left}-({args1}))"; - case "ToString": return $"cast({left} as varchar(100))"; - } - } - return null; - } public override string ExpressionLambdaToSqlCallConvert(MethodCallExpression exp, ExpTSC tsc) { Func getExp = exparg => ExpressionLambdaToSql(exparg, tsc); diff --git a/Providers/FreeSql.Provider.Dameng/DamengAdo/DamengAdo.cs b/Providers/FreeSql.Provider.Dameng/DamengAdo/DamengAdo.cs index b9aa5a67..9497451f 100644 --- a/Providers/FreeSql.Provider.Dameng/DamengAdo/DamengAdo.cs +++ b/Providers/FreeSql.Provider.Dameng/DamengAdo/DamengAdo.cs @@ -35,8 +35,8 @@ namespace FreeSql.Dameng slaveConnectionStrings?.ToList().ForEach(slaveConnectionString => { var slavePool = isAdoPool ? - new DbConnectionStringPool(base.DataType, $"{CoreStrings.S_SlaveDatabase}{SlavePools.Count + 1}", () => new DmConnection(slaveConnectionString)) as IObjectPool : - new DamengConnectionPool($"{CoreStrings.S_SlaveDatabase}{SlavePools.Count + 1}", slaveConnectionString, () => Interlocked.Decrement(ref slaveUnavailables), () => Interlocked.Increment(ref slaveUnavailables)); + new DbConnectionStringPool(base.DataType, $"{CoreStrings.S_SlaveDatabase}{SlavePools.Count + 1}", () => new DmConnection(slaveConnectionString)) as IObjectPool : + new DamengConnectionPool($"{CoreStrings.S_SlaveDatabase}{SlavePools.Count + 1}", slaveConnectionString, () => Interlocked.Decrement(ref slaveUnavailables), () => Interlocked.Increment(ref slaveUnavailables)); SlavePools.Add(slavePool); }); } diff --git a/Providers/FreeSql.Provider.Dameng/DamengExpression.cs b/Providers/FreeSql.Provider.Dameng/DamengExpression.cs index e50d495c..0aaca5a6 100644 --- a/Providers/FreeSql.Provider.Dameng/DamengExpression.cs +++ b/Providers/FreeSql.Provider.Dameng/DamengExpression.cs @@ -235,35 +235,6 @@ namespace FreeSql.Dameng } return null; } - public override string ExpressionLambdaToSqlMemberAccessTimeSpan(MemberExpression exp, ExpTSC tsc) - { - if (exp.Expression == null) - { - switch (exp.Member.Name) - { - case "Zero": return "numtodsinterval(0,'second')"; - case "MinValue": return "numtodsinterval(-233720368.5477580,'second')"; - case "MaxValue": return "numtodsinterval(233720368.5477580,'second')"; - } - return null; - } - var left = ExpressionLambdaToSql(exp.Expression, tsc); - switch (exp.Member.Name) - { - case "Days": return $"extract(day from {left})"; - case "Hours": return $"extract(hour from {left})"; - case "Milliseconds": return $"cast(substr(extract(second from {left})-floor(extract(second from {left})),3,3) as number)"; - case "Minutes": return $"extract(minute from {left})"; - case "Seconds": return $"floor(extract(second from {left}))"; - case "Ticks": return $"(extract(day from {left})*86400+extract(hour from {left})*3600+extract(minute from {left})*60+extract(second from {left}))*10000000"; - case "TotalDays": return $"extract(day from {left})"; - case "TotalHours": return $"(extract(day from {left})*24+extract(hour from {left}))"; - case "TotalMilliseconds": return $"(extract(day from {left})*86400+extract(hour from {left})*3600+extract(minute from {left})*60+extract(second from {left}))*1000"; - case "TotalMinutes": return $"(extract(day from {left})*1440+extract(hour from {left})*60+extract(minute from {left}))"; - case "TotalSeconds": return $"(extract(day from {left})*86400+extract(hour from {left})*3600+extract(minute from {left})*60+extract(second from {left}))"; - } - return null; - } public override string ExpressionLambdaToSqlCallString(MethodCallExpression exp, ExpTSC tsc) { @@ -439,7 +410,6 @@ namespace FreeSql.Dameng var args1 = exp.Arguments.Count == 0 ? null : getExp(exp.Arguments[0]); switch (exp.Method.Name) { - case "Add": return $"({left}+{args1})"; case "AddDays": return $"({left}+{args1})"; case "AddHours": return $"({left}+({args1})/24)"; case "AddMilliseconds": return $"({left}+({args1})/86400000)"; @@ -519,42 +489,6 @@ namespace FreeSql.Dameng } return null; } - public override string ExpressionLambdaToSqlCallTimeSpan(MethodCallExpression exp, ExpTSC tsc) - { - Func getExp = exparg => ExpressionLambdaToSql(exparg, tsc); - if (exp.Object == null) - { - switch (exp.Method.Name) - { - case "Compare": return $"extract(day from ({getExp(exp.Arguments[0])}-({getExp(exp.Arguments[1])})))"; - case "Equals": return $"({getExp(exp.Arguments[0])} = {getExp(exp.Arguments[1])})"; - case "FromDays": return $"numtodsinterval(({getExp(exp.Arguments[0])})*{(long)60 * 60 * 24},'second')"; - case "FromHours": return $"numtodsinterval(({getExp(exp.Arguments[0])})*{(long)60 * 60},'second')"; - case "FromMilliseconds": return $"numtodsinterval(({getExp(exp.Arguments[0])})/1000,'second')"; - case "FromMinutes": return $"numtodsinterval(({getExp(exp.Arguments[0])})*60,'second')"; - case "FromSeconds": return $"numtodsinterval(({getExp(exp.Arguments[0])}),'second')"; - case "FromTicks": return $"numtodsinterval(({getExp(exp.Arguments[0])})/10000000,'second')"; - case "Parse": return $"cast({getExp(exp.Arguments[0])} as interval day(9) to second(6))"; - case "ParseExact": - case "TryParse": - case "TryParseExact": return $"cast({getExp(exp.Arguments[0])} as interval day(9) to second(6))"; - } - } - else - { - var left = getExp(exp.Object); - var args1 = exp.Arguments.Count == 0 ? null : getExp(exp.Arguments[0]); - switch (exp.Method.Name) - { - case "Add": return $"({left}+{args1})"; - case "Subtract": return $"({left}-({args1}))"; - case "Equals": return $"({left} = {args1})"; - case "CompareTo": return $"extract(day from ({left}-({args1})))"; - case "ToString": return $"to_char({left})"; - } - } - return null; - } public override string ExpressionLambdaToSqlCallConvert(MethodCallExpression exp, ExpTSC tsc) { Func getExp = exparg => ExpressionLambdaToSql(exparg, tsc); diff --git a/Providers/FreeSql.Provider.Firebird/FirebirdAdo/FirebirdAdo.cs b/Providers/FreeSql.Provider.Firebird/FirebirdAdo/FirebirdAdo.cs index 67091700..b1e889f0 100644 --- a/Providers/FreeSql.Provider.Firebird/FirebirdAdo/FirebirdAdo.cs +++ b/Providers/FreeSql.Provider.Firebird/FirebirdAdo/FirebirdAdo.cs @@ -37,8 +37,8 @@ namespace FreeSql.Firebird slaveConnectionStrings?.ToList().ForEach(slaveConnectionString => { var slavePool = isAdoPool ? - new DbConnectionStringPool(base.DataType, $"{CoreStrings.S_SlaveDatabase}{SlavePools.Count + 1}", () => new FbConnection(slaveConnectionString)) as IObjectPool : - new FirebirdConnectionPool($"{CoreStrings.S_SlaveDatabase}{SlavePools.Count + 1}", slaveConnectionString, () => Interlocked.Decrement(ref slaveUnavailables), () => Interlocked.Increment(ref slaveUnavailables)); + new DbConnectionStringPool(base.DataType, $"{CoreStrings.S_SlaveDatabase}{SlavePools.Count + 1}", () => new FbConnection(slaveConnectionString)) as IObjectPool : + new FirebirdConnectionPool($"{CoreStrings.S_SlaveDatabase}{SlavePools.Count + 1}", slaveConnectionString, () => Interlocked.Decrement(ref slaveUnavailables), () => Interlocked.Increment(ref slaveUnavailables)); SlavePools.Add(slavePool); }); } @@ -86,7 +86,10 @@ namespace FreeSql.Firebird return AddslashesTypeHandler(typeof(DateTime?), param) ?? string.Concat("timestamp '", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.fff"), "'"); else if (param is TimeSpan || param is TimeSpan?) - return ((TimeSpan)param).Ticks / 10; + { + var ts = (TimeSpan)param; + return $"'{Math.Floor(ts.TotalHours)}:{ts.Minutes}:{ts.Seconds}'"; + } else if (param is byte[]) return $"x'{CommonUtils.BytesSqlRaw(param as byte[])}'"; else if (param is IEnumerable) diff --git a/Providers/FreeSql.Provider.Firebird/FirebirdExpression.cs b/Providers/FreeSql.Provider.Firebird/FirebirdExpression.cs index 41748e51..ecae94e2 100644 --- a/Providers/FreeSql.Provider.Firebird/FirebirdExpression.cs +++ b/Providers/FreeSql.Provider.Firebird/FirebirdExpression.cs @@ -222,35 +222,6 @@ namespace FreeSql.Firebird } return null; } - public override string ExpressionLambdaToSqlMemberAccessTimeSpan(MemberExpression exp, ExpTSC tsc) - { - if (exp.Expression == null) - { - switch (exp.Member.Name) - { - case "Zero": return "0"; - case "MinValue": return "-922337203685.477580"; //秒 Ticks / 1000,000,0 - case "MaxValue": return "922337203685.477580"; - } - return null; - } - var left = ExpressionLambdaToSql(exp.Expression, tsc); - switch (exp.Member.Name) - { - case "Days": return $"floor(({left})/{60 * 60 * 24})"; - case "Hours": return $"mod(({left})/{60 * 60},24)"; - case "Milliseconds": return $"(cast({left} as bigint)*1000)"; - case "Minutes": return $"mod(({left})/60,60)"; - case "Seconds": return $"mod({left},60)"; - case "Ticks": return $"(cast({left} as bigint)*10000000)"; - case "TotalDays": return $"(({left})/{60 * 60 * 24})"; - case "TotalHours": return $"(({left})/{60 * 60})"; - case "TotalMilliseconds": return $"(cast({left} as bigint)*1000)"; - case "TotalMinutes": return $"(({left})/60)"; - case "TotalSeconds": return $"({left})"; - } - return null; - } public override string ExpressionLambdaToSqlCallString(MethodCallExpression exp, ExpTSC tsc) { @@ -424,7 +395,6 @@ namespace FreeSql.Firebird var args1 = exp.Arguments.Count == 0 ? null : getExp(exp.Arguments[0]); switch (exp.Method.Name) { - case "Add": return $"dateadd({args1} second to {left})"; case "AddDays": return $"dateadd({args1} day to {left})"; case "AddHours": return $"dateadd({args1} hour to {left})"; case "AddMilliseconds": return $"dateadd(({args1})/1000 second to {left})"; @@ -481,42 +451,6 @@ namespace FreeSql.Firebird } return null; } - public override string ExpressionLambdaToSqlCallTimeSpan(MethodCallExpression exp, ExpTSC tsc) - { - Func getExp = exparg => ExpressionLambdaToSql(exparg, tsc); - if (exp.Object == null) - { - switch (exp.Method.Name) - { - case "Compare": return $"({getExp(exp.Arguments[0])}-({getExp(exp.Arguments[1])}))"; - case "Equals": return $"({getExp(exp.Arguments[0])} = {getExp(exp.Arguments[1])})"; - case "FromDays": return $"(({getExp(exp.Arguments[0])})*{60 * 60 * 24})"; - case "FromHours": return $"(({getExp(exp.Arguments[0])})*{60 * 60})"; - case "FromMilliseconds": return $"(({getExp(exp.Arguments[0])})/1000)"; - case "FromMinutes": return $"(({getExp(exp.Arguments[0])})*60)"; - case "FromSeconds": return $"(({getExp(exp.Arguments[0])}))"; - case "FromTicks": return $"(({getExp(exp.Arguments[0])})/10000000)"; - case "Parse": return $"cast({getExp(exp.Arguments[0])} as bigint)"; - case "ParseExact": - case "TryParse": - case "TryParseExact": return $"cast({getExp(exp.Arguments[0])} as bigint)"; - } - } - else - { - var left = getExp(exp.Object); - var args1 = exp.Arguments.Count == 0 ? null : getExp(exp.Arguments[0]); - switch (exp.Method.Name) - { - case "Add": return $"({left}+{args1})"; - case "Subtract": return $"({left}-({args1}))"; - case "Equals": return $"({left} = {args1})"; - case "CompareTo": return $"({left}-({args1}))"; - case "ToString": return $"cast({left} as varchar(50))"; - } - } - return null; - } public override string ExpressionLambdaToSqlCallConvert(MethodCallExpression exp, ExpTSC tsc) { Func getExp = exparg => ExpressionLambdaToSql(exparg, tsc); diff --git a/Providers/FreeSql.Provider.GBase/GBaseAdo/GBaseAdo.cs b/Providers/FreeSql.Provider.GBase/GBaseAdo/GBaseAdo.cs index 1e9df8dc..adbb2198 100644 --- a/Providers/FreeSql.Provider.GBase/GBaseAdo/GBaseAdo.cs +++ b/Providers/FreeSql.Provider.GBase/GBaseAdo/GBaseAdo.cs @@ -37,8 +37,8 @@ namespace FreeSql.GBase slaveConnectionStrings?.ToList().ForEach(slaveConnectionString => { var slavePool = isAdoPool ? - new DbConnectionStringPool(base.DataType, $"{CoreStrings.S_SlaveDatabase}{SlavePools.Count + 1}", () => new OdbcConnection(slaveConnectionString)) as IObjectPool : - new GBaseConnectionPool($"{CoreStrings.S_SlaveDatabase}{SlavePools.Count + 1}", slaveConnectionString, () => Interlocked.Decrement(ref slaveUnavailables), () => Interlocked.Increment(ref slaveUnavailables)); + new DbConnectionStringPool(base.DataType, $"{CoreStrings.S_SlaveDatabase}{SlavePools.Count + 1}", () => new OdbcConnection(slaveConnectionString)) as IObjectPool : + new GBaseConnectionPool($"{CoreStrings.S_SlaveDatabase}{SlavePools.Count + 1}", slaveConnectionString, () => Interlocked.Decrement(ref slaveUnavailables), () => Interlocked.Increment(ref slaveUnavailables)); SlavePools.Add(slavePool); }); } diff --git a/Providers/FreeSql.Provider.GBase/GBaseExpression.cs b/Providers/FreeSql.Provider.GBase/GBaseExpression.cs index ca4000fb..3812e755 100644 --- a/Providers/FreeSql.Provider.GBase/GBaseExpression.cs +++ b/Providers/FreeSql.Provider.GBase/GBaseExpression.cs @@ -222,35 +222,6 @@ namespace FreeSql.GBase } return null; } - public override string ExpressionLambdaToSqlMemberAccessTimeSpan(MemberExpression exp, ExpTSC tsc) - { - if (exp.Expression == null) - { - switch (exp.Member.Name) - { - case "Zero": return "0"; - case "MinValue": return "interval(0) day(9) to fraction"; //秒 Ticks / 1000,000,0 - case "MaxValue": return "interval(99 23:59:59.999) day(9) to fraction"; - } - return null; - } - var left = ExpressionLambdaToSql(exp.Expression, tsc); - switch (exp.Member.Name) - { - case "Days": return $"({left})::interval day(9) to day::varchar(40)::int8"; - case "Hours": return $"substr(substring_index(({left})::varchar(40),' ',-1),1,2)::int8"; - case "Milliseconds": return $"substring_index(({left})::varchar(40),'.',-1)::int8"; - case "Minutes": return $"substr(substring_index(({left})::varchar(40),' ',-1),4,2)::int8"; - case "Seconds": return $"substr(substring_index(({left})::varchar(40),' ',-1),7,2)::int8"; - case "Ticks": return $"(({left})::interval day(9) to day::varchar(40)::int8 *24*60*60*1000 + substr(substring_index(({left})::varchar(40),' ',-1),1,2)::int8 *60*60*1000 + substr(substring_index(({left})::varchar(40),' ',-1),4,2)::int8 *60*1000 + substr(substring_index(({left})::varchar(40),' ',-1),7,2)::int8 *1000 + substring_index(({left})::varchar(40),'.',-1)::int8) * 10000"; - case "TotalDays": return $"(({left})::interval day(9) to day::varchar(40)::int8 *24 + substr(substring_index(({left})::varchar(40),' ',-1),1,2)::int8) /24.0"; - case "TotalHours": return $"(({left})::interval day(9) to day::varchar(40)::int8 *24*60 + substr(substring_index(({left})::varchar(40),' ',-1),1,2)::int8 *60 + substr(substring_index(({left})::varchar(40),' ',-1),4,2)::int8) /60.0"; - case "TotalMilliseconds": return $"(({left})::interval day(9) to day::varchar(40)::int8 *24*60*60*1000 + substr(substring_index(({left})::varchar(40),' ',-1),1,2)::int8 *60*60*1000 + substr(substring_index(({left})::varchar(40),' ',-1),4,2)::int8 *60*1000 + substr(substring_index(({left})::varchar(40),' ',-1),7,2)::int8 *1000 + substring_index(({left})::varchar(40),'.',-1)::int8)"; - case "TotalMinutes": return $"(({left})::interval day(9) to day::varchar(40)::int8 *24*60*60 + substr(substring_index(({left})::varchar(40),' ',-1),1,2)::int8 *60*60 + substr(substring_index(({left})::varchar(40),' ',-1),4,2)::int8 *60 + substr(substring_index(({left})::varchar(40),' ',-1),7,2)::int8) /60.0"; - case "TotalSeconds": return $"(({left})::interval day(9) to day::varchar(40)::int8 *24*60*60*1000 + substr(substring_index(({left})::varchar(40),' ',-1),1,2)::int8 *60*60*1000 + substr(substring_index(({left})::varchar(40),' ',-1),4,2)::int8 *60*1000 + substr(substring_index(({left})::varchar(40),' ',-1),7,2)::int8 *1000 + substring_index(({left})::varchar(40),'.',-1)::int8) /1000.0"; - } - return null; - } public override string ExpressionLambdaToSqlCallString(MethodCallExpression exp, ExpTSC tsc) { @@ -424,7 +395,6 @@ namespace FreeSql.GBase var args1 = exp.Arguments.Count == 0 ? null : getExp(exp.Arguments[0]); switch (exp.Method.Name) { - case "Add": return $"({left} + ({args1}))"; case "AddDays": return $"({left} + ({args1}) units day)"; case "AddHours": return $"({left} + ({args1}) units hour)"; case "AddMilliseconds": return $"({left} + ({args1})/1000 units fraction)"; @@ -513,42 +483,6 @@ namespace FreeSql.GBase } return null; } - public override string ExpressionLambdaToSqlCallTimeSpan(MethodCallExpression exp, ExpTSC tsc) - { - Func getExp = exparg => ExpressionLambdaToSql(exparg, tsc); - if (exp.Object == null) - { - switch (exp.Method.Name) - { - case "Compare": return $"({getExp(exp.Arguments[0])} - ({getExp(exp.Arguments[1])}))"; - case "Equals": return $"({getExp(exp.Arguments[0])} = {getExp(exp.Arguments[1])})"; - case "FromDays": return $"(interval(0) day(9) to fraction + ({getExp(exp.Arguments[0])}) units day)"; - case "FromHours": return $"(interval(0) day(9) to fraction + ({getExp(exp.Arguments[0])}) units hour)"; - case "FromMilliseconds": return $"(interval(0) day(9) to fraction + ({getExp(exp.Arguments[0])})/1000 units fraction)"; - case "FromMinutes": return $"(interval(0) day(9) to fraction + ({getExp(exp.Arguments[0])}) units minute)"; - case "FromSeconds": return $"(interval(0) day(9) to fraction + ({getExp(exp.Arguments[0])}) units second)"; - case "FromTicks": return $"(interval(0) day(9) to fraction + ({getExp(exp.Arguments[0])})/10000000 units fraction)"; - case "Parse": return $"cast({getExp(exp.Arguments[0])} as interval day(9) to fraction)"; - case "ParseExact": - case "TryParse": - case "TryParseExact": return $"cast({getExp(exp.Arguments[0])} as interval day(9) to fraction)"; - } - } - else - { - var left = getExp(exp.Object); - var args1 = exp.Arguments.Count == 0 ? null : getExp(exp.Arguments[0]); - switch (exp.Method.Name) - { - case "Add": return $"({left} + {args1})"; - case "Subtract": return $"({left} - ({args1}))"; - case "Equals": return $"({left} = {args1})"; - case "CompareTo": return $"({left} - ({args1}))"; - case "ToString": return $"cast({left} as varchar(50))"; - } - } - return null; - } public override string ExpressionLambdaToSqlCallConvert(MethodCallExpression exp, ExpTSC tsc) { Func getExp = exparg => ExpressionLambdaToSql(exparg, tsc); diff --git a/Providers/FreeSql.Provider.KingbaseES/KingbaseESAdo/KingbaseESAdo.cs b/Providers/FreeSql.Provider.KingbaseES/KingbaseESAdo/KingbaseESAdo.cs index c6377d62..16731231 100644 --- a/Providers/FreeSql.Provider.KingbaseES/KingbaseESAdo/KingbaseESAdo.cs +++ b/Providers/FreeSql.Provider.KingbaseES/KingbaseESAdo/KingbaseESAdo.cs @@ -35,8 +35,8 @@ namespace FreeSql.KingbaseES slaveConnectionStrings?.ToList().ForEach(slaveConnectionString => { var slavePool = isAdoPool ? - new DbConnectionStringPool(base.DataType, $"{CoreStrings.S_SlaveDatabase}{SlavePools.Count + 1}", () => new KdbndpConnection(slaveConnectionString)) as IObjectPool : - new KingbaseESConnectionPool($"{CoreStrings.S_SlaveDatabase}{SlavePools.Count + 1}", slaveConnectionString, () => Interlocked.Decrement(ref slaveUnavailables), () => Interlocked.Increment(ref slaveUnavailables)); + new DbConnectionStringPool(base.DataType, $"{CoreStrings.S_SlaveDatabase}{SlavePools.Count + 1}", () => new KdbndpConnection(slaveConnectionString)) as IObjectPool : + new KingbaseESConnectionPool($"{CoreStrings.S_SlaveDatabase}{SlavePools.Count + 1}", slaveConnectionString, () => Interlocked.Decrement(ref slaveUnavailables), () => Interlocked.Increment(ref slaveUnavailables)); SlavePools.Add(slavePool); }); } @@ -63,7 +63,10 @@ namespace FreeSql.KingbaseES return AddslashesTypeHandler(typeof(DateTime?), param) ?? string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.ffffff"), "'"); else if (param is TimeSpan || param is TimeSpan?) - return ((TimeSpan)param).Ticks / 10; + { + var ts = (TimeSpan)param; + return $"'{Math.Min(24, (int)Math.Floor(ts.TotalHours))}:{ts.Minutes}:{ts.Seconds}'"; + } else if (param is byte[]) return $"'\\x{CommonUtils.BytesSqlRaw(param as byte[])}'"; else if (param is IEnumerable) diff --git a/Providers/FreeSql.Provider.KingbaseES/KingbaseESExpression.cs b/Providers/FreeSql.Provider.KingbaseES/KingbaseESExpression.cs index dee12a3d..1ce0cca4 100644 --- a/Providers/FreeSql.Provider.KingbaseES/KingbaseESExpression.cs +++ b/Providers/FreeSql.Provider.KingbaseES/KingbaseESExpression.cs @@ -297,35 +297,6 @@ namespace FreeSql.KingbaseES } return null; } - public override string ExpressionLambdaToSqlMemberAccessTimeSpan(MemberExpression exp, ExpTSC tsc) - { - if (exp.Expression == null) - { - switch (exp.Member.Name) - { - case "Zero": return "0"; - case "MinValue": return "-922337203685477580"; //微秒 Ticks / 10 - case "MaxValue": return "922337203685477580"; - } - return null; - } - var left = ExpressionLambdaToSql(exp.Expression, tsc); - switch (exp.Member.Name) - { - case "Days": return $"floor(({left})/{(long)1000000 * 60 * 60 * 24})"; - case "Hours": return $"floor(({left})/{(long)1000000 * 60 * 60}%24)"; - case "Milliseconds": return $"(floor(({left})/1000)::int8%1000)"; - case "Minutes": return $"(floor(({left})/{(long)1000000 * 60})::int8%60)"; - case "Seconds": return $"(floor(({left})/1000000)::int8%60)"; - case "Ticks": return $"(({left})*10)"; - case "TotalDays": return $"(({left})/{(long)1000000 * 60 * 60 * 24})"; - case "TotalHours": return $"(({left})/{(long)1000000 * 60 * 60})"; - case "TotalMilliseconds": return $"(({left})/1000)"; - case "TotalMinutes": return $"(({left})/{(long)1000000 * 60})"; - case "TotalSeconds": return $"(({left})/1000000)"; - } - return null; - } public override string ExpressionLambdaToSqlCallString(MethodCallExpression exp, ExpTSC tsc) { @@ -503,7 +474,6 @@ namespace FreeSql.KingbaseES var args1 = exp.Arguments.Count == 0 ? null : getExp(exp.Arguments[0]); switch (exp.Method.Name) { - case "Add": return $"(({left})::timestamp+((({args1})/1000)||' milliseconds')::interval)"; case "AddDays": return $"(({left})::timestamp+(({args1})||' day')::interval)"; case "AddHours": return $"(({left})::timestamp+(({args1})||' hour')::interval)"; case "AddMilliseconds": return $"(({left})::timestamp+(({args1})||' milliseconds')::interval)"; @@ -582,42 +552,6 @@ namespace FreeSql.KingbaseES } return null; } - public override string ExpressionLambdaToSqlCallTimeSpan(MethodCallExpression exp, ExpTSC tsc) - { - Func getExp = exparg => ExpressionLambdaToSql(exparg, tsc); - if (exp.Object == null) - { - switch (exp.Method.Name) - { - case "Compare": return $"({getExp(exp.Arguments[0])}-({getExp(exp.Arguments[1])}))"; - case "Equals": return $"({getExp(exp.Arguments[0])} = {getExp(exp.Arguments[1])})"; - case "FromDays": return $"(({getExp(exp.Arguments[0])})*{(long)1000000 * 60 * 60 * 24})"; - case "FromHours": return $"(({getExp(exp.Arguments[0])})*{(long)1000000 * 60 * 60})"; - case "FromMilliseconds": return $"(({getExp(exp.Arguments[0])})*1000)"; - case "FromMinutes": return $"(({getExp(exp.Arguments[0])})*{(long)1000000 * 60})"; - case "FromSeconds": return $"(({getExp(exp.Arguments[0])})*1000000)"; - case "FromTicks": return $"(({getExp(exp.Arguments[0])})/10)"; - case "Parse": return $"({getExp(exp.Arguments[0])})::int8"; - case "ParseExact": - case "TryParse": - case "TryParseExact": return $"({getExp(exp.Arguments[0])})::int8"; - } - } - else - { - var left = getExp(exp.Object); - var args1 = exp.Arguments.Count == 0 ? null : getExp(exp.Arguments[0]); - switch (exp.Method.Name) - { - case "Add": return $"({left}+{args1})"; - case "Subtract": return $"({left}-({args1}))"; - case "Equals": return $"({left} = {args1})"; - case "CompareTo": return $"({left}-({args1}))"; - case "ToString": return $"({left})::varchar"; - } - } - return null; - } public override string ExpressionLambdaToSqlCallConvert(MethodCallExpression exp, ExpTSC tsc) { Func getExp = exparg => ExpressionLambdaToSql(exparg, tsc); diff --git a/Providers/FreeSql.Provider.MsAccess/MsAccessAdo/MsAccessAdo.cs b/Providers/FreeSql.Provider.MsAccess/MsAccessAdo/MsAccessAdo.cs index 8ac0d0d0..8b484e28 100644 --- a/Providers/FreeSql.Provider.MsAccess/MsAccessAdo/MsAccessAdo.cs +++ b/Providers/FreeSql.Provider.MsAccess/MsAccessAdo/MsAccessAdo.cs @@ -35,8 +35,8 @@ namespace FreeSql.MsAccess slaveConnectionStrings?.ToList().ForEach(slaveConnectionString => { var slavePool = isAdoPool ? - new DbConnectionStringPool(base.DataType, $"{CoreStrings.S_SlaveDatabase}{SlavePools.Count + 1}", () => new OleDbConnection(slaveConnectionString)) as IObjectPool : - new MsAccessConnectionPool($"{CoreStrings.S_SlaveDatabase}{SlavePools.Count + 1}", slaveConnectionString, () => Interlocked.Decrement(ref slaveUnavailables), () => Interlocked.Increment(ref slaveUnavailables)); + new DbConnectionStringPool(base.DataType, $"{CoreStrings.S_SlaveDatabase}{SlavePools.Count + 1}", () => new OleDbConnection(slaveConnectionString)) as IObjectPool : + new MsAccessConnectionPool($"{CoreStrings.S_SlaveDatabase}{SlavePools.Count + 1}", slaveConnectionString, () => Interlocked.Decrement(ref slaveUnavailables), () => Interlocked.Increment(ref slaveUnavailables)); SlavePools.Add(slavePool); }); } @@ -74,7 +74,10 @@ namespace FreeSql.MsAccess } else if (param is TimeSpan || param is TimeSpan?) - return ((TimeSpan)param).TotalSeconds; + { + var ts = (TimeSpan)param; + return $"'{ts.Hours}:{ts.Minutes}:{ts.Seconds}'"; + } else if (param is byte[]) return $"0x{CommonUtils.BytesSqlRaw(param as byte[])}"; else if (param is IEnumerable) diff --git a/Providers/FreeSql.Provider.MsAccess/MsAccessExpression.cs b/Providers/FreeSql.Provider.MsAccess/MsAccessExpression.cs index 6f982418..e1a12130 100644 --- a/Providers/FreeSql.Provider.MsAccess/MsAccessExpression.cs +++ b/Providers/FreeSql.Provider.MsAccess/MsAccessExpression.cs @@ -205,35 +205,6 @@ namespace FreeSql.MsAccess } return null; } - public override string ExpressionLambdaToSqlMemberAccessTimeSpan(MemberExpression exp, ExpTSC tsc) - { - if (exp.Expression == null) - { - switch (exp.Member.Name) - { - case "Zero": return "0"; - case "MinValue": return "-922337203685477580"; //微秒 Ticks / 10 - case "MaxValue": return "922337203685477580"; - } - return null; - } - var left = ExpressionLambdaToSql(exp.Expression, tsc); - switch (exp.Member.Name) - { - case "Days": return $"clng(({left})/{60 * 60 * 24}+1)"; - case "Hours": return $"clng(({left})/{60 * 60} mod 24+1)"; - case "Milliseconds": return $"({MsAccessUtils.GetCastSql(left, typeof(long))}*1000)"; - case "Minutes": return $"clng(({left})/60 mod 60+1)"; - case "Seconds": return $"(({left}) mod 60)"; - case "Ticks": return $"({MsAccessUtils.GetCastSql(left, typeof(long))}*10000000)"; - case "TotalDays": return $"(({left})/{60 * 60 * 24})"; - case "TotalHours": return $"(({left})/{60 * 60})"; - case "TotalMilliseconds": return $"({MsAccessUtils.GetCastSql(left, typeof(long))}*1000)"; - case "TotalMinutes": return $"(({left})/60)"; - case "TotalSeconds": return $"({left})"; - } - return null; - } public override string ExpressionLambdaToSqlCallString(MethodCallExpression exp, ExpTSC tsc) { @@ -376,7 +347,6 @@ namespace FreeSql.MsAccess var args1 = exp.Arguments.Count == 0 ? null : getExp(exp.Arguments[0]); switch (exp.Method.Name) { - case "Add": return $"dateadd('s', {args1}, {left})"; case "AddDays": return $"dateadd('d', {args1}, {left})"; case "AddHours": return $"dateadd('h', {args1}, {left})"; case "AddMilliseconds": return $"dateadd('s', ({args1})/1000, {left})"; @@ -399,42 +369,6 @@ namespace FreeSql.MsAccess } return null; } - public override string ExpressionLambdaToSqlCallTimeSpan(MethodCallExpression exp, ExpTSC tsc) - { - Func getExp = exparg => ExpressionLambdaToSql(exparg, tsc); - if (exp.Object == null) - { - switch (exp.Method.Name) - { - case "Compare": return $"({getExp(exp.Arguments[0])}-({getExp(exp.Arguments[1])}))"; - case "Equals": return $"({getExp(exp.Arguments[0])} = {getExp(exp.Arguments[1])})"; - case "FromDays": return $"(({getExp(exp.Arguments[0])})*{60 * 60 * 24})"; - case "FromHours": return $"(({getExp(exp.Arguments[0])})*{60 * 60})"; - case "FromMilliseconds": return $"(({getExp(exp.Arguments[0])})/1000)"; - case "FromMinutes": return $"(({getExp(exp.Arguments[0])})*60)"; - case "FromSeconds": return $"({getExp(exp.Arguments[0])})"; - case "FromTicks": return $"(({getExp(exp.Arguments[0])})/10000000)"; - case "Parse": return MsAccessUtils.GetCastSql(getExp(exp.Arguments[0]), typeof(long)); - case "ParseExact": - case "TryParse": - case "TryParseExact": return MsAccessUtils.GetCastSql(getExp(exp.Arguments[0]), typeof(long)); - } - } - else - { - var left = getExp(exp.Object); - var args1 = exp.Arguments.Count == 0 ? null : getExp(exp.Arguments[0]); - switch (exp.Method.Name) - { - case "Add": return $"({left}+{args1})"; - case "Subtract": return $"({left}-({args1}))"; - case "Equals": return $"({left} = {args1})"; - case "CompareTo": return $"({left}-({args1}))"; - case "ToString": return MsAccessUtils.GetCastSql(left, typeof(string)); - } - } - return null; - } public override string ExpressionLambdaToSqlCallConvert(MethodCallExpression exp, ExpTSC tsc) { Func getExp = exparg => ExpressionLambdaToSql(exparg, tsc); diff --git a/Providers/FreeSql.Provider.MySql/MySqlAdo/MySqlAdo.cs b/Providers/FreeSql.Provider.MySql/MySqlAdo/MySqlAdo.cs index ff9fa288..a67ffca9 100644 --- a/Providers/FreeSql.Provider.MySql/MySqlAdo/MySqlAdo.cs +++ b/Providers/FreeSql.Provider.MySql/MySqlAdo/MySqlAdo.cs @@ -40,8 +40,8 @@ namespace FreeSql.MySql slaveConnectionStrings?.ToList().ForEach(slaveConnectionString => { var slavePool = isAdoPool ? - new DbConnectionStringPool(base.DataType, $"{CoreStrings.S_SlaveDatabase}{SlavePools.Count + 1}", () => new MySqlConnection(slaveConnectionString)) as IObjectPool : - new MySqlConnectionPool($"{CoreStrings.S_SlaveDatabase}{SlavePools.Count + 1}", slaveConnectionString, () => Interlocked.Decrement(ref slaveUnavailables), () => Interlocked.Increment(ref slaveUnavailables)); + new DbConnectionStringPool(base.DataType, $"{CoreStrings.S_SlaveDatabase}{SlavePools.Count + 1}", () => new MySqlConnection(slaveConnectionString)) as IObjectPool : + new MySqlConnectionPool($"{CoreStrings.S_SlaveDatabase}{SlavePools.Count + 1}", slaveConnectionString, () => Interlocked.Decrement(ref slaveUnavailables), () => Interlocked.Increment(ref slaveUnavailables)); SlavePools.Add(slavePool); }); } @@ -68,7 +68,10 @@ namespace FreeSql.MySql return AddslashesTypeHandler(typeof(DateTime?), param) ?? string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.fff"), "'"); else if (param is TimeSpan || param is TimeSpan?) - return ((TimeSpan)param).Ticks / 10; + { + var ts = (TimeSpan)param; + return $"'{Math.Floor(ts.TotalHours)}:{ts.Minutes}:{ts.Seconds}'"; + } else if (param is byte[]) return $"0x{CommonUtils.BytesSqlRaw(param as byte[])}"; else if (param is MygisGeometry) diff --git a/Providers/FreeSql.Provider.MySql/MySqlExpression.cs b/Providers/FreeSql.Provider.MySql/MySqlExpression.cs index 9ae5b7af..d353ee49 100644 --- a/Providers/FreeSql.Provider.MySql/MySqlExpression.cs +++ b/Providers/FreeSql.Provider.MySql/MySqlExpression.cs @@ -233,35 +233,6 @@ namespace FreeSql.MySql } return null; } - public override string ExpressionLambdaToSqlMemberAccessTimeSpan(MemberExpression exp, ExpTSC tsc) - { - if (exp.Expression == null) - { - switch (exp.Member.Name) - { - case "Zero": return "0"; - case "MinValue": return "-922337203685477580"; //微秒 Ticks / 10 - case "MaxValue": return "922337203685477580"; - } - return null; - } - var left = ExpressionLambdaToSql(exp.Expression, tsc); - switch (exp.Member.Name) - { - case "Days": return $"(({left}) div {(long)1000000 * 60 * 60 * 24})"; - case "Hours": return $"(({left}) div {(long)1000000 * 60 * 60} mod 24)"; - case "Milliseconds": return $"(({left}) div 1000 mod 1000)"; - case "Minutes": return $"(({left}) div {(long)1000000 * 60} mod 60)"; - case "Seconds": return $"(({left}) div 1000000 mod 60)"; - case "Ticks": return $"(({left}) * 10)"; - case "TotalDays": return $"(({left}) / {(long)1000000 * 60 * 60 * 24})"; - case "TotalHours": return $"(({left}) / {(long)1000000 * 60 * 60})"; - case "TotalMilliseconds": return $"(({left}) / 1000)"; - case "TotalMinutes": return $"(({left}) / {(long)1000000 * 60})"; - case "TotalSeconds": return $"(({left}) / 1000000)"; - } - return null; - } public override string ExpressionLambdaToSqlCallString(MethodCallExpression exp, ExpTSC tsc) { @@ -436,7 +407,6 @@ namespace FreeSql.MySql var args1 = exp.Arguments.Count == 0 ? null : getExp(exp.Arguments[0]); switch (exp.Method.Name) { - case "Add": return $"date_add({left}, interval ({args1}) microsecond)"; case "AddDays": return $"date_add({left}, interval ({args1}) day)"; case "AddHours": return $"date_add({left}, interval ({args1}) hour)"; case "AddMilliseconds": return $"date_add({left}, interval ({args1})*1000 microsecond)"; @@ -514,42 +484,6 @@ namespace FreeSql.MySql } return null; } - public override string ExpressionLambdaToSqlCallTimeSpan(MethodCallExpression exp, ExpTSC tsc) - { - Func getExp = exparg => ExpressionLambdaToSql(exparg, tsc); - if (exp.Object == null) - { - switch (exp.Method.Name) - { - case "Compare": return $"({getExp(exp.Arguments[0])}-({getExp(exp.Arguments[1])}))"; - case "Equals": return $"({getExp(exp.Arguments[0])} = {getExp(exp.Arguments[1])})"; - case "FromDays": return $"(({getExp(exp.Arguments[0])})*{(long)1000000 * 60 * 60 * 24})"; - case "FromHours": return $"(({getExp(exp.Arguments[0])})*{(long)1000000 * 60 * 60})"; - case "FromMilliseconds": return $"(({getExp(exp.Arguments[0])})*1000)"; - case "FromMinutes": return $"(({getExp(exp.Arguments[0])})*{(long)1000000 * 60})"; - case "FromSeconds": return $"(({getExp(exp.Arguments[0])})*1000000)"; - case "FromTicks": return $"(({getExp(exp.Arguments[0])})/10)"; - case "Parse": return $"cast({getExp(exp.Arguments[0])} as signed)"; - case "ParseExact": - case "TryParse": - case "TryParseExact": return $"cast({getExp(exp.Arguments[0])} as signed)"; - } - } - else - { - var left = getExp(exp.Object); - var args1 = exp.Arguments.Count == 0 ? null : getExp(exp.Arguments[0]); - switch (exp.Method.Name) - { - case "Add": return $"({left}+{args1})"; - case "Subtract": return $"({left}-({args1}))"; - case "Equals": return $"({left} = {args1})"; - case "CompareTo": return $"({left}-({args1}))"; - case "ToString": return $"cast({left} as char)"; - } - } - return null; - } public override string ExpressionLambdaToSqlCallConvert(MethodCallExpression exp, ExpTSC tsc) { Func getExp = exparg => ExpressionLambdaToSql(exparg, tsc); diff --git a/Providers/FreeSql.Provider.Odbc/Dameng/OdbcDamengAdo/OdbcDamengAdo.cs b/Providers/FreeSql.Provider.Odbc/Dameng/OdbcDamengAdo/OdbcDamengAdo.cs index 8ba353ca..7ed10e9e 100644 --- a/Providers/FreeSql.Provider.Odbc/Dameng/OdbcDamengAdo/OdbcDamengAdo.cs +++ b/Providers/FreeSql.Provider.Odbc/Dameng/OdbcDamengAdo/OdbcDamengAdo.cs @@ -36,8 +36,8 @@ namespace FreeSql.Odbc.Dameng slaveConnectionStrings?.ToList().ForEach(slaveConnectionString => { var slavePool = isAdoPool ? - new DbConnectionStringPool(base.DataType, $"{CoreStrings.S_SlaveDatabase}{SlavePools.Count + 1}", () => new OdbcConnection(slaveConnectionString)) as IObjectPool : - new OdbcDamengConnectionPool($"{CoreStrings.S_SlaveDatabase}{SlavePools.Count + 1}", slaveConnectionString, () => Interlocked.Decrement(ref slaveUnavailables), () => Interlocked.Increment(ref slaveUnavailables)); + new DbConnectionStringPool(base.DataType, $"{CoreStrings.S_SlaveDatabase}{SlavePools.Count + 1}", () => new OdbcConnection(slaveConnectionString)) as IObjectPool : + new OdbcDamengConnectionPool($"{CoreStrings.S_SlaveDatabase}{SlavePools.Count + 1}", slaveConnectionString, () => Interlocked.Decrement(ref slaveUnavailables), () => Interlocked.Increment(ref slaveUnavailables)); SlavePools.Add(slavePool); }); } diff --git a/Providers/FreeSql.Provider.Odbc/Dameng/OdbcDamengExpression.cs b/Providers/FreeSql.Provider.Odbc/Dameng/OdbcDamengExpression.cs index a1b7f3ff..16cc7323 100644 --- a/Providers/FreeSql.Provider.Odbc/Dameng/OdbcDamengExpression.cs +++ b/Providers/FreeSql.Provider.Odbc/Dameng/OdbcDamengExpression.cs @@ -235,35 +235,6 @@ namespace FreeSql.Odbc.Dameng } return null; } - public override string ExpressionLambdaToSqlMemberAccessTimeSpan(MemberExpression exp, ExpTSC tsc) - { - if (exp.Expression == null) - { - switch (exp.Member.Name) - { - case "Zero": return "numtodsinterval(0,'second')"; - case "MinValue": return "numtodsinterval(-233720368.5477580,'second')"; - case "MaxValue": return "numtodsinterval(233720368.5477580,'second')"; - } - return null; - } - var left = ExpressionLambdaToSql(exp.Expression, tsc); - switch (exp.Member.Name) - { - case "Days": return $"extract(day from {left})"; - case "Hours": return $"extract(hour from {left})"; - case "Milliseconds": return $"cast(substr(extract(second from {left})-floor(extract(second from {left})),3,3) as number)"; - case "Minutes": return $"extract(minute from {left})"; - case "Seconds": return $"floor(extract(second from {left}))"; - case "Ticks": return $"(extract(day from {left})*86400+extract(hour from {left})*3600+extract(minute from {left})*60+extract(second from {left}))*10000000"; - case "TotalDays": return $"extract(day from {left})"; - case "TotalHours": return $"(extract(day from {left})*24+extract(hour from {left}))"; - case "TotalMilliseconds": return $"(extract(day from {left})*86400+extract(hour from {left})*3600+extract(minute from {left})*60+extract(second from {left}))*1000"; - case "TotalMinutes": return $"(extract(day from {left})*1440+extract(hour from {left})*60+extract(minute from {left}))"; - case "TotalSeconds": return $"(extract(day from {left})*86400+extract(hour from {left})*3600+extract(minute from {left})*60+extract(second from {left}))"; - } - return null; - } public override string ExpressionLambdaToSqlCallString(MethodCallExpression exp, ExpTSC tsc) { @@ -439,7 +410,6 @@ namespace FreeSql.Odbc.Dameng var args1 = exp.Arguments.Count == 0 ? null : getExp(exp.Arguments[0]); switch (exp.Method.Name) { - case "Add": return $"({left}+{args1})"; case "AddDays": return $"({left}+{args1})"; case "AddHours": return $"({left}+({args1})/24)"; case "AddMilliseconds": return $"({left}+({args1})/86400000)"; @@ -519,42 +489,6 @@ namespace FreeSql.Odbc.Dameng } return null; } - public override string ExpressionLambdaToSqlCallTimeSpan(MethodCallExpression exp, ExpTSC tsc) - { - Func getExp = exparg => ExpressionLambdaToSql(exparg, tsc); - if (exp.Object == null) - { - switch (exp.Method.Name) - { - case "Compare": return $"extract(day from ({getExp(exp.Arguments[0])}-({getExp(exp.Arguments[1])})))"; - case "Equals": return $"({getExp(exp.Arguments[0])} = {getExp(exp.Arguments[1])})"; - case "FromDays": return $"numtodsinterval(({getExp(exp.Arguments[0])})*{(long)60 * 60 * 24},'second')"; - case "FromHours": return $"numtodsinterval(({getExp(exp.Arguments[0])})*{(long)60 * 60},'second')"; - case "FromMilliseconds": return $"numtodsinterval(({getExp(exp.Arguments[0])})/1000,'second')"; - case "FromMinutes": return $"numtodsinterval(({getExp(exp.Arguments[0])})*60,'second')"; - case "FromSeconds": return $"numtodsinterval(({getExp(exp.Arguments[0])}),'second')"; - case "FromTicks": return $"numtodsinterval(({getExp(exp.Arguments[0])})/10000000,'second')"; - case "Parse": return $"cast({getExp(exp.Arguments[0])} as interval day(9) to second(6))"; - case "ParseExact": - case "TryParse": - case "TryParseExact": return $"cast({getExp(exp.Arguments[0])} as interval day(9) to second(6))"; - } - } - else - { - var left = getExp(exp.Object); - var args1 = exp.Arguments.Count == 0 ? null : getExp(exp.Arguments[0]); - switch (exp.Method.Name) - { - case "Add": return $"({left}+{args1})"; - case "Subtract": return $"({left}-({args1}))"; - case "Equals": return $"({left} = {args1})"; - case "CompareTo": return $"extract(day from ({left}-({args1})))"; - case "ToString": return $"to_char({left})"; - } - } - return null; - } public override string ExpressionLambdaToSqlCallConvert(MethodCallExpression exp, ExpTSC tsc) { Func getExp = exparg => ExpressionLambdaToSql(exparg, tsc); diff --git a/Providers/FreeSql.Provider.Odbc/Default/OdbcAdapter.cs b/Providers/FreeSql.Provider.Odbc/Default/OdbcAdapter.cs index 7a9cbfd4..49f48be5 100644 --- a/Providers/FreeSql.Provider.Odbc/Default/OdbcAdapter.cs +++ b/Providers/FreeSql.Provider.Odbc/Default/OdbcAdapter.cs @@ -53,7 +53,12 @@ namespace FreeSql.Odbc.Default if (value.Equals(DateTime.MinValue) == true) value = new DateTime(1970, 1, 1); return string.Concat("'", ((DateTime)value).ToString("yyyy-MM-dd HH:mm:ss"), "'"); } - public virtual string TimeSpanRawSql(object value) => value == null ? "NULL" : ((TimeSpan)value).TotalSeconds.ToString(); + public virtual string TimeSpanRawSql(object value) + { + if (value == null) return "NULL"; + var ts = (TimeSpan)value; + return $"'{ts.Hours}:{ts.Minutes}:{ts.Seconds}.{ts.Milliseconds}'"; + } public virtual string ByteRawSql(object value) { if (value == null) return "NULL"; @@ -136,7 +141,6 @@ namespace FreeSql.Odbc.Default public virtual string LambdaDateTime_DaysInMonth(string year, string month) => $"datepart(day, dateadd(day, -1, dateadd(month, 1, cast({year} as varchar) + '-' + cast({month} as varchar) + '-1')))"; public virtual string LambdaDateTime_IsLeapYear(string year) => $"(({year})%4=0 AND ({year})%100<>0 OR ({year})%400=0)"; - public virtual string LambdaDateTime_Add(string operand, string value) => $"dateadd(second, {value}, {operand})"; public virtual string LambdaDateTime_AddDays(string operand, string value) => $"dateadd(day, {value}, {operand})"; public virtual string LambdaDateTime_AddHours(string operand, string value) => $"dateadd(hour, {value}, {operand})"; public virtual string LambdaDateTime_AddMilliseconds(string operand, string value) => $"dateadd(second, ({value})/1000, {operand})"; diff --git a/Providers/FreeSql.Provider.Odbc/Default/OdbcAdo/OdbcAdo.cs b/Providers/FreeSql.Provider.Odbc/Default/OdbcAdo/OdbcAdo.cs index 6667e4d2..4500a5ea 100644 --- a/Providers/FreeSql.Provider.Odbc/Default/OdbcAdo/OdbcAdo.cs +++ b/Providers/FreeSql.Provider.Odbc/Default/OdbcAdo/OdbcAdo.cs @@ -37,8 +37,8 @@ namespace FreeSql.Odbc.Default slaveConnectionStrings?.ToList().ForEach(slaveConnectionString => { var slavePool = isAdoPool ? - new DbConnectionStringPool(base.DataType, $"{CoreStrings.S_SlaveDatabase}{SlavePools.Count + 1}", () => new OdbcConnection(slaveConnectionString)) as IObjectPool : - new OdbcConnectionPool($"{CoreStrings.S_SlaveDatabase}{SlavePools.Count + 1}", slaveConnectionString, () => Interlocked.Decrement(ref slaveUnavailables), () => Interlocked.Increment(ref slaveUnavailables)); + new DbConnectionStringPool(base.DataType, $"{CoreStrings.S_SlaveDatabase}{SlavePools.Count + 1}", () => new OdbcConnection(slaveConnectionString)) as IObjectPool : + new OdbcConnectionPool($"{CoreStrings.S_SlaveDatabase}{SlavePools.Count + 1}", slaveConnectionString, () => Interlocked.Decrement(ref slaveUnavailables), () => Interlocked.Increment(ref slaveUnavailables)); SlavePools.Add(slavePool); }); } diff --git a/Providers/FreeSql.Provider.Odbc/Default/OdbcExpression.cs b/Providers/FreeSql.Provider.Odbc/Default/OdbcExpression.cs index 24d22582..bc3337fa 100644 --- a/Providers/FreeSql.Provider.Odbc/Default/OdbcExpression.cs +++ b/Providers/FreeSql.Provider.Odbc/Default/OdbcExpression.cs @@ -236,35 +236,6 @@ namespace FreeSql.Odbc.Default return null; } - public override string ExpressionLambdaToSqlMemberAccessTimeSpan(MemberExpression exp, ExpTSC tsc) - { - if (exp.Expression == null) - { - switch (exp.Member.Name) - { - case "Zero": return "0"; - case "MinValue": return "-922337203685477580"; //微秒 Ticks / 10 - case "MaxValue": return "922337203685477580"; - } - return null; - } - var left = ExpressionLambdaToSql(exp.Expression, tsc); - switch (exp.Member.Name) - { - case "Days": return _utils.Adapter.LambdaMath_Floor($"({left})/{60 * 60 * 24}"); - case "Hours": return _utils.Adapter.LambdaMath_Floor($"({left})/{60 * 60}%24"); - case "Milliseconds": return $"({_utils.Adapter.CastSql(left, _utils.Adapter.MappingOdbcTypeBigInt)}*1000)"; - case "Minutes": return _utils.Adapter.LambdaMath_Floor($"({left})/60%60"); - case "Seconds": return $"(({left})%60)"; - case "Ticks": return $"({_utils.Adapter.CastSql(left, _utils.Adapter.MappingOdbcTypeBigInt)}*10000000)"; - case "TotalDays": return $"(({left})/{60 * 60 * 24})"; - case "TotalHours": return $"(({left})/{60 * 60})"; - case "TotalMilliseconds": return $"({_utils.Adapter.CastSql(left, _utils.Adapter.MappingOdbcTypeBigInt)}*1000)"; - case "TotalMinutes": return $"(({left})/60)"; - case "TotalSeconds": return $"({left})"; - } - return null; - } public override string ExpressionLambdaToSqlCallString(MethodCallExpression exp, ExpTSC tsc) { @@ -382,7 +353,6 @@ namespace FreeSql.Odbc.Default var args1 = exp.Arguments.Count == 0 ? null : getExp(exp.Arguments[0]); switch (exp.Method.Name) { - case "Add": return _utils.Adapter.LambdaDateTime_Add(left, args1); case "AddDays": return _utils.Adapter.LambdaDateTime_AddDays(left, args1); case "AddHours": return _utils.Adapter.LambdaDateTime_AddHours(left, args1); case "AddMilliseconds": return _utils.Adapter.LambdaDateTime_AddMilliseconds(left, args1); @@ -411,42 +381,6 @@ namespace FreeSql.Odbc.Default public virtual string LambdaDateSpan_Equals(string oldvalue, string newvalue) => $"({oldvalue} = {newvalue})"; public virtual string LambdaDateSpan_CompareTo(string oldvalue, string newvalue) => $"({oldvalue}-({newvalue}))"; - public override string ExpressionLambdaToSqlCallTimeSpan(MethodCallExpression exp, ExpTSC tsc) - { - Func getExp = exparg => ExpressionLambdaToSql(exparg, tsc); - if (exp.Object == null) - { - switch (exp.Method.Name) - { - case "Compare": return $"({getExp(exp.Arguments[0])}-({getExp(exp.Arguments[1])}))"; - case "Equals": return $"({getExp(exp.Arguments[0])} = {getExp(exp.Arguments[1])})"; - case "FromDays": return $"(({getExp(exp.Arguments[0])})*{60 * 60 * 24})"; - case "FromHours": return $"(({getExp(exp.Arguments[0])})*{60 * 60})"; - case "FromMilliseconds": return $"(({getExp(exp.Arguments[0])})/1000)"; - case "FromMinutes": return $"(({getExp(exp.Arguments[0])})*60)"; - case "FromSeconds": return $"({getExp(exp.Arguments[0])})"; - case "FromTicks": return $"(({getExp(exp.Arguments[0])})/10000000)"; - case "Parse": return _utils.Adapter.LambdaConvert_ToInt64(exp.Arguments[0].Type, getExp(exp.Arguments[0])); - case "ParseExact": - case "TryParse": - case "TryParseExact": return _utils.Adapter.LambdaConvert_ToInt64(exp.Arguments[0].Type, getExp(exp.Arguments[0])); - } - } - else - { - var left = getExp(exp.Object); - var args1 = exp.Arguments.Count == 0 ? null : getExp(exp.Arguments[0]); - switch (exp.Method.Name) - { - case "Add": return $"({left}+{args1})"; - case "Subtract": return $"({left}-({args1}))"; - case "Equals": return $"({left} = {args1})"; - case "CompareTo": return $"({left}-({args1}))"; - case "ToString": return _utils.Adapter.LambdaConvert_ToString(exp.Type, left); - } - } - return null; - } public override string ExpressionLambdaToSqlCallConvert(MethodCallExpression exp, ExpTSC tsc) { Func getExp = exparg => ExpressionLambdaToSql(exparg, tsc); diff --git a/Providers/FreeSql.Provider.Odbc/KingbaseES/OdbcKingbaseESAdo/OdbcKingbaseESAdo.cs b/Providers/FreeSql.Provider.Odbc/KingbaseES/OdbcKingbaseESAdo/OdbcKingbaseESAdo.cs index 7272e22f..415f17ad 100644 --- a/Providers/FreeSql.Provider.Odbc/KingbaseES/OdbcKingbaseESAdo/OdbcKingbaseESAdo.cs +++ b/Providers/FreeSql.Provider.Odbc/KingbaseES/OdbcKingbaseESAdo/OdbcKingbaseESAdo.cs @@ -38,8 +38,8 @@ namespace FreeSql.Odbc.KingbaseES slaveConnectionStrings?.ToList().ForEach(slaveConnectionString => { var slavePool = isAdoPool ? - new DbConnectionStringPool(base.DataType, $"{CoreStrings.S_SlaveDatabase}{SlavePools.Count + 1}", () => new OdbcConnection(slaveConnectionString)) as IObjectPool : - new OdbcKingbaseESConnectionPool($"{CoreStrings.S_SlaveDatabase}{SlavePools.Count + 1}", slaveConnectionString, () => Interlocked.Decrement(ref slaveUnavailables), () => Interlocked.Increment(ref slaveUnavailables)); + new DbConnectionStringPool(base.DataType, $"{CoreStrings.S_SlaveDatabase}{SlavePools.Count + 1}", () => new OdbcConnection(slaveConnectionString)) as IObjectPool : + new OdbcKingbaseESConnectionPool($"{CoreStrings.S_SlaveDatabase}{SlavePools.Count + 1}", slaveConnectionString, () => Interlocked.Decrement(ref slaveUnavailables), () => Interlocked.Increment(ref slaveUnavailables)); SlavePools.Add(slavePool); }); } @@ -66,7 +66,10 @@ namespace FreeSql.Odbc.KingbaseES return AddslashesTypeHandler(typeof(DateTime?), param) ?? string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.ffffff"), "'"); else if (param is TimeSpan || param is TimeSpan?) - return ((TimeSpan)param).Ticks / 10; + { + var ts = (TimeSpan)param; + return $"'{Math.Min(24, (int)Math.Floor(ts.TotalHours))}:{ts.Minutes}:{ts.Seconds}'"; + } else if (param is byte[]) return $"'\\x{CommonUtils.BytesSqlRaw(param as byte[])}'"; else if (param is IEnumerable) diff --git a/Providers/FreeSql.Provider.Odbc/KingbaseES/OdbcKingbaseESExpression.cs b/Providers/FreeSql.Provider.Odbc/KingbaseES/OdbcKingbaseESExpression.cs index b5d7e5c3..22c8054f 100644 --- a/Providers/FreeSql.Provider.Odbc/KingbaseES/OdbcKingbaseESExpression.cs +++ b/Providers/FreeSql.Provider.Odbc/KingbaseES/OdbcKingbaseESExpression.cs @@ -297,35 +297,6 @@ namespace FreeSql.Odbc.KingbaseES } return null; } - public override string ExpressionLambdaToSqlMemberAccessTimeSpan(MemberExpression exp, ExpTSC tsc) - { - if (exp.Expression == null) - { - switch (exp.Member.Name) - { - case "Zero": return "0"; - case "MinValue": return "-922337203685477580"; //微秒 Ticks / 10 - case "MaxValue": return "922337203685477580"; - } - return null; - } - var left = ExpressionLambdaToSql(exp.Expression, tsc); - switch (exp.Member.Name) - { - case "Days": return $"floor(({left})/{(long)1000000 * 60 * 60 * 24})"; - case "Hours": return $"floor(({left})/{(long)1000000 * 60 * 60}%24)"; - case "Milliseconds": return $"(floor(({left})/1000)::int8%1000)"; - case "Minutes": return $"(floor(({left})/{(long)1000000 * 60})::int8%60)"; - case "Seconds": return $"(floor(({left})/1000000)::int8%60)"; - case "Ticks": return $"(({left})*10)"; - case "TotalDays": return $"(({left})/{(long)1000000 * 60 * 60 * 24})"; - case "TotalHours": return $"(({left})/{(long)1000000 * 60 * 60})"; - case "TotalMilliseconds": return $"(({left})/1000)"; - case "TotalMinutes": return $"(({left})/{(long)1000000 * 60})"; - case "TotalSeconds": return $"(({left})/1000000)"; - } - return null; - } public override string ExpressionLambdaToSqlCallString(MethodCallExpression exp, ExpTSC tsc) { @@ -503,7 +474,6 @@ namespace FreeSql.Odbc.KingbaseES var args1 = exp.Arguments.Count == 0 ? null : getExp(exp.Arguments[0]); switch (exp.Method.Name) { - case "Add": return $"(({left})::timestamp+((({args1})/1000)||' milliseconds')::interval)"; case "AddDays": return $"(({left})::timestamp+(({args1})||' day')::interval)"; case "AddHours": return $"(({left})::timestamp+(({args1})||' hour')::interval)"; case "AddMilliseconds": return $"(({left})::timestamp+(({args1})||' milliseconds')::interval)"; @@ -582,42 +552,6 @@ namespace FreeSql.Odbc.KingbaseES } return null; } - public override string ExpressionLambdaToSqlCallTimeSpan(MethodCallExpression exp, ExpTSC tsc) - { - Func getExp = exparg => ExpressionLambdaToSql(exparg, tsc); - if (exp.Object == null) - { - switch (exp.Method.Name) - { - case "Compare": return $"({getExp(exp.Arguments[0])}-({getExp(exp.Arguments[1])}))"; - case "Equals": return $"({getExp(exp.Arguments[0])} = {getExp(exp.Arguments[1])})"; - case "FromDays": return $"(({getExp(exp.Arguments[0])})*{(long)1000000 * 60 * 60 * 24})"; - case "FromHours": return $"(({getExp(exp.Arguments[0])})*{(long)1000000 * 60 * 60})"; - case "FromMilliseconds": return $"(({getExp(exp.Arguments[0])})*1000)"; - case "FromMinutes": return $"(({getExp(exp.Arguments[0])})*{(long)1000000 * 60})"; - case "FromSeconds": return $"(({getExp(exp.Arguments[0])})*1000000)"; - case "FromTicks": return $"(({getExp(exp.Arguments[0])})/10)"; - case "Parse": return $"({getExp(exp.Arguments[0])})::int8"; - case "ParseExact": - case "TryParse": - case "TryParseExact": return $"({getExp(exp.Arguments[0])})::int8"; - } - } - else - { - var left = getExp(exp.Object); - var args1 = exp.Arguments.Count == 0 ? null : getExp(exp.Arguments[0]); - switch (exp.Method.Name) - { - case "Add": return $"({left}+{args1})"; - case "Subtract": return $"({left}-({args1}))"; - case "Equals": return $"({left} = {args1})"; - case "CompareTo": return $"({left}-({args1}))"; - case "ToString": return $"({left})::varchar"; - } - } - return null; - } public override string ExpressionLambdaToSqlCallConvert(MethodCallExpression exp, ExpTSC tsc) { Func getExp = exparg => ExpressionLambdaToSql(exparg, tsc); diff --git a/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlAdo/OdbcMySqlAdo.cs b/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlAdo/OdbcMySqlAdo.cs index c39b1dc3..62839fd6 100644 --- a/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlAdo/OdbcMySqlAdo.cs +++ b/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlAdo/OdbcMySqlAdo.cs @@ -38,8 +38,8 @@ namespace FreeSql.Odbc.MySql slaveConnectionStrings?.ToList().ForEach(slaveConnectionString => { var slavePool = isAdoPool ? - new DbConnectionStringPool(base.DataType, $"{CoreStrings.S_SlaveDatabase}{SlavePools.Count + 1}", () => new OdbcConnection(slaveConnectionString)) as IObjectPool : - new OdbcMySqlConnectionPool($"{CoreStrings.S_SlaveDatabase}{SlavePools.Count + 1}", slaveConnectionString, () => Interlocked.Decrement(ref slaveUnavailables), () => Interlocked.Increment(ref slaveUnavailables)); + new DbConnectionStringPool(base.DataType, $"{CoreStrings.S_SlaveDatabase}{SlavePools.Count + 1}", () => new OdbcConnection(slaveConnectionString)) as IObjectPool : + new OdbcMySqlConnectionPool($"{CoreStrings.S_SlaveDatabase}{SlavePools.Count + 1}", slaveConnectionString, () => Interlocked.Decrement(ref slaveUnavailables), () => Interlocked.Increment(ref slaveUnavailables)); SlavePools.Add(slavePool); }); } @@ -66,7 +66,10 @@ namespace FreeSql.Odbc.MySql return AddslashesTypeHandler(typeof(DateTime?), param) ?? string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.fff"), "'"); else if (param is TimeSpan || param is TimeSpan?) - return ((TimeSpan)param).Ticks / 10; + { + var ts = (TimeSpan)param; + return $"'{Math.Floor(ts.TotalHours)}:{ts.Minutes}:{ts.Seconds}'"; + } else if (param is byte[]) return $"0x{CommonUtils.BytesSqlRaw(param as byte[])}"; else if (param is IEnumerable) diff --git a/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlExpression.cs b/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlExpression.cs index 34710f93..ddb2c5cb 100644 --- a/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlExpression.cs +++ b/Providers/FreeSql.Provider.Odbc/MySql/OdbcMySqlExpression.cs @@ -231,35 +231,6 @@ namespace FreeSql.Odbc.MySql } return null; } - public override string ExpressionLambdaToSqlMemberAccessTimeSpan(MemberExpression exp, ExpTSC tsc) - { - if (exp.Expression == null) - { - switch (exp.Member.Name) - { - case "Zero": return "0"; - case "MinValue": return "-922337203685477580"; //微秒 Ticks / 10 - case "MaxValue": return "922337203685477580"; - } - return null; - } - var left = ExpressionLambdaToSql(exp.Expression, tsc); - switch (exp.Member.Name) - { - case "Days": return $"(({left}) div {(long)1000000 * 60 * 60 * 24})"; - case "Hours": return $"(({left}) div {(long)1000000 * 60 * 60} mod 24)"; - case "Milliseconds": return $"(({left}) div 1000 mod 1000)"; - case "Minutes": return $"(({left}) div {(long)1000000 * 60} mod 60)"; - case "Seconds": return $"(({left}) div 1000000 mod 60)"; - case "Ticks": return $"(({left}) * 10)"; - case "TotalDays": return $"(({left}) / {(long)1000000 * 60 * 60 * 24})"; - case "TotalHours": return $"(({left}) / {(long)1000000 * 60 * 60})"; - case "TotalMilliseconds": return $"(({left}) / 1000)"; - case "TotalMinutes": return $"(({left}) / {(long)1000000 * 60})"; - case "TotalSeconds": return $"(({left}) / 1000000)"; - } - return null; - } public override string ExpressionLambdaToSqlCallString(MethodCallExpression exp, ExpTSC tsc) { @@ -434,7 +405,6 @@ namespace FreeSql.Odbc.MySql var args1 = exp.Arguments.Count == 0 ? null : getExp(exp.Arguments[0]); switch (exp.Method.Name) { - case "Add": return $"date_add({left}, interval ({args1}) microsecond)"; case "AddDays": return $"date_add({left}, interval ({args1}) day)"; case "AddHours": return $"date_add({left}, interval ({args1}) hour)"; case "AddMilliseconds": return $"date_add({left}, interval ({args1})*1000 microsecond)"; @@ -512,42 +482,6 @@ namespace FreeSql.Odbc.MySql } return null; } - public override string ExpressionLambdaToSqlCallTimeSpan(MethodCallExpression exp, ExpTSC tsc) - { - Func getExp = exparg => ExpressionLambdaToSql(exparg, tsc); - if (exp.Object == null) - { - switch (exp.Method.Name) - { - case "Compare": return $"({getExp(exp.Arguments[0])}-({getExp(exp.Arguments[1])}))"; - case "Equals": return $"({getExp(exp.Arguments[0])} = {getExp(exp.Arguments[1])})"; - case "FromDays": return $"(({getExp(exp.Arguments[0])})*{(long)1000000 * 60 * 60 * 24})"; - case "FromHours": return $"(({getExp(exp.Arguments[0])})*{(long)1000000 * 60 * 60})"; - case "FromMilliseconds": return $"(({getExp(exp.Arguments[0])})*1000)"; - case "FromMinutes": return $"(({getExp(exp.Arguments[0])})*{(long)1000000 * 60})"; - case "FromSeconds": return $"(({getExp(exp.Arguments[0])})*1000000)"; - case "FromTicks": return $"(({getExp(exp.Arguments[0])})/10)"; - case "Parse": return $"cast({getExp(exp.Arguments[0])} as signed)"; - case "ParseExact": - case "TryParse": - case "TryParseExact": return $"cast({getExp(exp.Arguments[0])} as signed)"; - } - } - else - { - var left = getExp(exp.Object); - var args1 = exp.Arguments.Count == 0 ? null : getExp(exp.Arguments[0]); - switch (exp.Method.Name) - { - case "Add": return $"({left}+{args1})"; - case "Subtract": return $"({left}-({args1}))"; - case "Equals": return $"({left} = {args1})"; - case "CompareTo": return $"({left}-({args1}))"; - case "ToString": return $"cast({left} as char)"; - } - } - return null; - } public override string ExpressionLambdaToSqlCallConvert(MethodCallExpression exp, ExpTSC tsc) { Func getExp = exparg => ExpressionLambdaToSql(exparg, tsc); diff --git a/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleAdo/OdbcOracleAdo.cs b/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleAdo/OdbcOracleAdo.cs index 1cb2ab72..126ff26d 100644 --- a/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleAdo/OdbcOracleAdo.cs +++ b/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleAdo/OdbcOracleAdo.cs @@ -37,8 +37,8 @@ namespace FreeSql.Odbc.Oracle slaveConnectionStrings?.ToList().ForEach(slaveConnectionString => { var slavePool = isAdoPool ? - new DbConnectionStringPool(base.DataType, $"{CoreStrings.S_SlaveDatabase}{SlavePools.Count + 1}", () => new OdbcConnection(slaveConnectionString)) as IObjectPool : - new OdbcOracleConnectionPool($"{CoreStrings.S_SlaveDatabase}{SlavePools.Count + 1}", slaveConnectionString, () => Interlocked.Decrement(ref slaveUnavailables), () => Interlocked.Increment(ref slaveUnavailables)); + new DbConnectionStringPool(base.DataType, $"{CoreStrings.S_SlaveDatabase}{SlavePools.Count + 1}", () => new OdbcConnection(slaveConnectionString)) as IObjectPool : + new OdbcOracleConnectionPool($"{CoreStrings.S_SlaveDatabase}{SlavePools.Count + 1}", slaveConnectionString, () => Interlocked.Decrement(ref slaveUnavailables), () => Interlocked.Increment(ref slaveUnavailables)); SlavePools.Add(slavePool); }); } diff --git a/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleExpression.cs b/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleExpression.cs index 333ea598..b2d41ff6 100644 --- a/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleExpression.cs +++ b/Providers/FreeSql.Provider.Odbc/Oracle/OdbcOracleExpression.cs @@ -235,35 +235,6 @@ namespace FreeSql.Odbc.Oracle } return null; } - public override string ExpressionLambdaToSqlMemberAccessTimeSpan(MemberExpression exp, ExpTSC tsc) - { - if (exp.Expression == null) - { - switch (exp.Member.Name) - { - case "Zero": return "numtodsinterval(0,'second')"; - case "MinValue": return "numtodsinterval(-233720368.5477580,'second')"; - case "MaxValue": return "numtodsinterval(233720368.5477580,'second')"; - } - return null; - } - var left = ExpressionLambdaToSql(exp.Expression, tsc); - switch (exp.Member.Name) - { - case "Days": return $"extract(day from {left})"; - case "Hours": return $"extract(hour from {left})"; - case "Milliseconds": return $"cast(substr(extract(second from {left})-floor(extract(second from {left})),3,3) as number)"; - case "Minutes": return $"extract(minute from {left})"; - case "Seconds": return $"floor(extract(second from {left}))"; - case "Ticks": return $"(extract(day from {left})*86400+extract(hour from {left})*3600+extract(minute from {left})*60+extract(second from {left}))*10000000"; - case "TotalDays": return $"extract(day from {left})"; - case "TotalHours": return $"(extract(day from {left})*24+extract(hour from {left}))"; - case "TotalMilliseconds": return $"(extract(day from {left})*86400+extract(hour from {left})*3600+extract(minute from {left})*60+extract(second from {left}))*1000"; - case "TotalMinutes": return $"(extract(day from {left})*1440+extract(hour from {left})*60+extract(minute from {left}))"; - case "TotalSeconds": return $"(extract(day from {left})*86400+extract(hour from {left})*3600+extract(minute from {left})*60+extract(second from {left}))"; - } - return null; - } public override string ExpressionLambdaToSqlCallString(MethodCallExpression exp, ExpTSC tsc) { @@ -439,7 +410,6 @@ namespace FreeSql.Odbc.Oracle var args1 = exp.Arguments.Count == 0 ? null : getExp(exp.Arguments[0]); switch (exp.Method.Name) { - case "Add": return $"({left}+{args1})"; case "AddDays": return $"({left}+{args1})"; case "AddHours": return $"({left}+({args1})/24)"; case "AddMilliseconds": return $"({left}+({args1})/86400000)"; @@ -518,42 +488,6 @@ namespace FreeSql.Odbc.Oracle } return null; } - public override string ExpressionLambdaToSqlCallTimeSpan(MethodCallExpression exp, ExpTSC tsc) - { - Func getExp = exparg => ExpressionLambdaToSql(exparg, tsc); - if (exp.Object == null) - { - switch (exp.Method.Name) - { - case "Compare": return $"extract(day from ({getExp(exp.Arguments[0])}-({getExp(exp.Arguments[1])})))"; - case "Equals": return $"({getExp(exp.Arguments[0])} = {getExp(exp.Arguments[1])})"; - case "FromDays": return $"numtodsinterval(({getExp(exp.Arguments[0])})*{(long)60 * 60 * 24},'second')"; - case "FromHours": return $"numtodsinterval(({getExp(exp.Arguments[0])})*{(long)60 * 60},'second')"; - case "FromMilliseconds": return $"numtodsinterval(({getExp(exp.Arguments[0])})/1000,'second')"; - case "FromMinutes": return $"numtodsinterval(({getExp(exp.Arguments[0])})*60,'second')"; - case "FromSeconds": return $"numtodsinterval(({getExp(exp.Arguments[0])}),'second')"; - case "FromTicks": return $"numtodsinterval(({getExp(exp.Arguments[0])})/10000000,'second')"; - case "Parse": return $"cast({getExp(exp.Arguments[0])} as interval day(9) to second(7))"; - case "ParseExact": - case "TryParse": - case "TryParseExact": return $"cast({getExp(exp.Arguments[0])} as interval day(9) to second(7))"; - } - } - else - { - var left = getExp(exp.Object); - var args1 = exp.Arguments.Count == 0 ? null : getExp(exp.Arguments[0]); - switch (exp.Method.Name) - { - case "Add": return $"({left}+{args1})"; - case "Subtract": return $"({left}-({args1}))"; - case "Equals": return $"({left} = {args1})"; - case "CompareTo": return $"extract(day from ({left}-({args1})))"; - case "ToString": return $"to_char({left})"; - } - } - return null; - } public override string ExpressionLambdaToSqlCallConvert(MethodCallExpression exp, ExpTSC tsc) { Func getExp = exparg => ExpressionLambdaToSql(exparg, tsc); diff --git a/Providers/FreeSql.Provider.Odbc/PostgreSQL/OdbcPostgreSQLAdo/OdbcPostgreSQLAdo.cs b/Providers/FreeSql.Provider.Odbc/PostgreSQL/OdbcPostgreSQLAdo/OdbcPostgreSQLAdo.cs index 7218c3f2..2340cd15 100644 --- a/Providers/FreeSql.Provider.Odbc/PostgreSQL/OdbcPostgreSQLAdo/OdbcPostgreSQLAdo.cs +++ b/Providers/FreeSql.Provider.Odbc/PostgreSQL/OdbcPostgreSQLAdo/OdbcPostgreSQLAdo.cs @@ -38,8 +38,8 @@ namespace FreeSql.Odbc.PostgreSQL slaveConnectionStrings?.ToList().ForEach(slaveConnectionString => { var slavePool = isAdoPool ? - new DbConnectionStringPool(base.DataType, $"{CoreStrings.S_SlaveDatabase}{SlavePools.Count + 1}", () => new OdbcConnection(slaveConnectionString)) as IObjectPool : - new OdbcPostgreSQLConnectionPool($"{CoreStrings.S_SlaveDatabase}{SlavePools.Count + 1}", slaveConnectionString, () => Interlocked.Decrement(ref slaveUnavailables), () => Interlocked.Increment(ref slaveUnavailables)); + new DbConnectionStringPool(base.DataType, $"{CoreStrings.S_SlaveDatabase}{SlavePools.Count + 1}", () => new OdbcConnection(slaveConnectionString)) as IObjectPool : + new OdbcPostgreSQLConnectionPool($"{CoreStrings.S_SlaveDatabase}{SlavePools.Count + 1}", slaveConnectionString, () => Interlocked.Decrement(ref slaveUnavailables), () => Interlocked.Increment(ref slaveUnavailables)); SlavePools.Add(slavePool); }); } @@ -67,7 +67,10 @@ namespace FreeSql.Odbc.PostgreSQL return AddslashesTypeHandler(typeof(DateTime?), param) ?? string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.ffffff"), "'"); else if (param is TimeSpan || param is TimeSpan?) - return ((TimeSpan)param).Ticks / 10; + { + var ts = (TimeSpan)param; + return $"'{Math.Min(24, (int)Math.Floor(ts.TotalHours))}:{ts.Minutes}:{ts.Seconds}'"; + } else if (param is byte[]) return $"'\\x{CommonUtils.BytesSqlRaw(param as byte[])}'"; else if (param is IEnumerable) diff --git a/Providers/FreeSql.Provider.Odbc/PostgreSQL/OdbcPostgreSQLExpression.cs b/Providers/FreeSql.Provider.Odbc/PostgreSQL/OdbcPostgreSQLExpression.cs index 3367d102..523ac2e0 100644 --- a/Providers/FreeSql.Provider.Odbc/PostgreSQL/OdbcPostgreSQLExpression.cs +++ b/Providers/FreeSql.Provider.Odbc/PostgreSQL/OdbcPostgreSQLExpression.cs @@ -319,35 +319,6 @@ namespace FreeSql.Odbc.PostgreSQL } return null; } - public override string ExpressionLambdaToSqlMemberAccessTimeSpan(MemberExpression exp, ExpTSC tsc) - { - if (exp.Expression == null) - { - switch (exp.Member.Name) - { - case "Zero": return "0"; - case "MinValue": return "-922337203685477580"; //微秒 Ticks / 10 - case "MaxValue": return "922337203685477580"; - } - return null; - } - var left = ExpressionLambdaToSql(exp.Expression, tsc); - switch (exp.Member.Name) - { - case "Days": return $"floor(({left})/{(long)1000000 * 60 * 60 * 24})"; - case "Hours": return $"floor(({left})/{(long)1000000 * 60 * 60}%24)"; - case "Milliseconds": return $"(floor(({left})/1000)::int8%1000)"; - case "Minutes": return $"(floor(({left})/{(long)1000000 * 60})::int8%60)"; - case "Seconds": return $"(floor(({left})/1000000)::int8%60)"; - case "Ticks": return $"(({left})*10)"; - case "TotalDays": return $"(({left})/{(long)1000000 * 60 * 60 * 24})"; - case "TotalHours": return $"(({left})/{(long)1000000 * 60 * 60})"; - case "TotalMilliseconds": return $"(({left})/1000)"; - case "TotalMinutes": return $"(({left})/{(long)1000000 * 60})"; - case "TotalSeconds": return $"(({left})/1000000)"; - } - return null; - } public override string ExpressionLambdaToSqlCallString(MethodCallExpression exp, ExpTSC tsc) { @@ -528,7 +499,6 @@ namespace FreeSql.Odbc.PostgreSQL var args1 = exp.Arguments.Count == 0 ? null : getExp(exp.Arguments[0]); switch (exp.Method.Name) { - case "Add": return $"(({left})::timestamp+((({args1})/1000)||' milliseconds')::interval)"; case "AddDays": return $"(({left})::timestamp+(({args1})||' day')::interval)"; case "AddHours": return $"(({left})::timestamp+(({args1})||' hour')::interval)"; case "AddMilliseconds": return $"(({left})::timestamp+(({args1})||' milliseconds')::interval)"; @@ -607,42 +577,6 @@ namespace FreeSql.Odbc.PostgreSQL } return null; } - public override string ExpressionLambdaToSqlCallTimeSpan(MethodCallExpression exp, ExpTSC tsc) - { - Func getExp = exparg => ExpressionLambdaToSql(exparg, tsc); - if (exp.Object == null) - { - switch (exp.Method.Name) - { - case "Compare": return $"({getExp(exp.Arguments[0])}-({getExp(exp.Arguments[1])}))"; - case "Equals": return $"({getExp(exp.Arguments[0])} = {getExp(exp.Arguments[1])})"; - case "FromDays": return $"(({getExp(exp.Arguments[0])})*{(long)1000000 * 60 * 60 * 24})"; - case "FromHours": return $"(({getExp(exp.Arguments[0])})*{(long)1000000 * 60 * 60})"; - case "FromMilliseconds": return $"(({getExp(exp.Arguments[0])})*1000)"; - case "FromMinutes": return $"(({getExp(exp.Arguments[0])})*{(long)1000000 * 60})"; - case "FromSeconds": return $"(({getExp(exp.Arguments[0])})*1000000)"; - case "FromTicks": return $"(({getExp(exp.Arguments[0])})/10)"; - case "Parse": return $"({getExp(exp.Arguments[0])})::int8"; - case "ParseExact": - case "TryParse": - case "TryParseExact": return $"({getExp(exp.Arguments[0])})::int8"; - } - } - else - { - var left = getExp(exp.Object); - var args1 = exp.Arguments.Count == 0 ? null : getExp(exp.Arguments[0]); - switch (exp.Method.Name) - { - case "Add": return $"({left}+{args1})"; - case "Subtract": return $"({left}-({args1}))"; - case "Equals": return $"({left} = {args1})"; - case "CompareTo": return $"({left}-({args1}))"; - case "ToString": return $"({left})::varchar"; - } - } - return null; - } public override string ExpressionLambdaToSqlCallConvert(MethodCallExpression exp, ExpTSC tsc) { Func getExp = exparg => ExpressionLambdaToSql(exparg, tsc); diff --git a/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerAdo/OdbcSqlServerAdo.cs b/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerAdo/OdbcSqlServerAdo.cs index 68c78a73..1f864376 100644 --- a/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerAdo/OdbcSqlServerAdo.cs +++ b/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerAdo/OdbcSqlServerAdo.cs @@ -37,8 +37,8 @@ namespace FreeSql.Odbc.SqlServer slaveConnectionStrings?.ToList().ForEach(slaveConnectionString => { var slavePool = isAdoPool ? - new DbConnectionStringPool(base.DataType, $"{CoreStrings.S_SlaveDatabase}{SlavePools.Count + 1}", () => new OdbcConnection(slaveConnectionString)) as IObjectPool : - new OdbcSqlServerConnectionPool($"{CoreStrings.S_SlaveDatabase}{SlavePools.Count + 1}", slaveConnectionString, () => Interlocked.Decrement(ref slaveUnavailables), () => Interlocked.Increment(ref slaveUnavailables)); + new DbConnectionStringPool(base.DataType, $"{CoreStrings.S_SlaveDatabase}{SlavePools.Count + 1}", () => new OdbcConnection(slaveConnectionString)) as IObjectPool : + new OdbcSqlServerConnectionPool($"{CoreStrings.S_SlaveDatabase}{SlavePools.Count + 1}", slaveConnectionString, () => Interlocked.Decrement(ref slaveUnavailables), () => Interlocked.Increment(ref slaveUnavailables)); SlavePools.Add(slavePool); }); } @@ -86,7 +86,10 @@ namespace FreeSql.Odbc.SqlServer return string.Concat("'", ((DateTimeOffset)param).ToString("yyyy-MM-dd HH:mm:ss.fff zzzz"), "'"); } else if (param is TimeSpan || param is TimeSpan?) - return ((TimeSpan)param).TotalSeconds; + { + var ts = (TimeSpan)param; + return $"'{ts.Hours}:{ts.Minutes}:{ts.Seconds}.{ts.Milliseconds}'"; + } else if (param is byte[]) return $"0x{CommonUtils.BytesSqlRaw(param as byte[])}"; else if (param is IEnumerable) diff --git a/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerExpression.cs b/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerExpression.cs index abe8b4b5..9eeac59f 100644 --- a/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerExpression.cs +++ b/Providers/FreeSql.Provider.Odbc/SqlServer/OdbcSqlServerExpression.cs @@ -241,35 +241,6 @@ namespace FreeSql.Odbc.SqlServer } return null; } - public override string ExpressionLambdaToSqlMemberAccessTimeSpan(MemberExpression exp, ExpTSC tsc) - { - if (exp.Expression == null) - { - switch (exp.Member.Name) - { - case "Zero": return "0"; - case "MinValue": return "-922337203685477580"; //微秒 Ticks / 10 - case "MaxValue": return "922337203685477580"; - } - return null; - } - var left = ExpressionLambdaToSql(exp.Expression, tsc); - switch (exp.Member.Name) - { - case "Days": return $"floor(({left})/{60 * 60 * 24})"; - case "Hours": return $"floor(({left})/{60 * 60}%24)"; - case "Milliseconds": return $"(cast({left} as bigint)*1000)"; - case "Minutes": return $"floor(({left})/60%60)"; - case "Seconds": return $"(({left})%60)"; - case "Ticks": return $"(cast({left} as bigint)*10000000)"; - case "TotalDays": return $"(({left})/{60 * 60 * 24})"; - case "TotalHours": return $"(({left})/{60 * 60})"; - case "TotalMilliseconds": return $"(cast({left} as bigint)*1000)"; - case "TotalMinutes": return $"(({left})/60)"; - case "TotalSeconds": return $"({left})"; - } - return null; - } public override string ExpressionLambdaToSqlCallString(MethodCallExpression exp, ExpTSC tsc) { @@ -435,7 +406,6 @@ namespace FreeSql.Odbc.SqlServer var args1 = exp.Arguments.Count == 0 ? null : getExp(exp.Arguments[0]); switch (exp.Method.Name) { - case "Add": return $"dateadd(second, {args1}, {left})"; case "AddDays": return $"dateadd(day, {args1}, {left})"; case "AddHours": return $"dateadd(hour, {args1}, {left})"; case "AddMilliseconds": return $"dateadd(second, ({args1})/1000, {left})"; @@ -503,42 +473,6 @@ namespace FreeSql.Odbc.SqlServer } return null; } - public override string ExpressionLambdaToSqlCallTimeSpan(MethodCallExpression exp, ExpTSC tsc) - { - Func getExp = exparg => ExpressionLambdaToSql(exparg, tsc); - if (exp.Object == null) - { - switch (exp.Method.Name) - { - case "Compare": return $"({getExp(exp.Arguments[0])}-({getExp(exp.Arguments[1])}))"; - case "Equals": return $"({getExp(exp.Arguments[0])} = {getExp(exp.Arguments[1])})"; - case "FromDays": return $"(({getExp(exp.Arguments[0])})*{60 * 60 * 24})"; - case "FromHours": return $"(({getExp(exp.Arguments[0])})*{60 * 60})"; - case "FromMilliseconds": return $"(({getExp(exp.Arguments[0])})/1000)"; - case "FromMinutes": return $"(({getExp(exp.Arguments[0])})*60)"; - case "FromSeconds": return $"({getExp(exp.Arguments[0])})"; - case "FromTicks": return $"(({getExp(exp.Arguments[0])})/10000000)"; - case "Parse": return $"cast({getExp(exp.Arguments[0])} as bigint)"; - case "ParseExact": - case "TryParse": - case "TryParseExact": return $"cast({getExp(exp.Arguments[0])} as bigint)"; - } - } - else - { - var left = getExp(exp.Object); - var args1 = exp.Arguments.Count == 0 ? null : getExp(exp.Arguments[0]); - switch (exp.Method.Name) - { - case "Add": return $"({left}+{args1})"; - case "Subtract": return $"({left}-({args1}))"; - case "Equals": return $"({left} = {args1})"; - case "CompareTo": return $"({left}-({args1}))"; - case "ToString": return $"cast({left} as varchar(100))"; - } - } - return null; - } public override string ExpressionLambdaToSqlCallConvert(MethodCallExpression exp, ExpTSC tsc) { Func getExp = exparg => ExpressionLambdaToSql(exparg, tsc); diff --git a/Providers/FreeSql.Provider.Oracle/OracleAdo/OracleAdo.cs b/Providers/FreeSql.Provider.Oracle/OracleAdo/OracleAdo.cs index c9bb06f7..d238df70 100644 --- a/Providers/FreeSql.Provider.Oracle/OracleAdo/OracleAdo.cs +++ b/Providers/FreeSql.Provider.Oracle/OracleAdo/OracleAdo.cs @@ -36,8 +36,8 @@ namespace FreeSql.Oracle slaveConnectionStrings?.ToList().ForEach(slaveConnectionString => { var slavePool = isAdoPool ? - new DbConnectionStringPool(base.DataType, $"{CoreStrings.S_SlaveDatabase}{SlavePools.Count + 1}", () => OracleConnectionPool.CreateConnection(slaveConnectionString)) as IObjectPool : - new OracleConnectionPool($"{CoreStrings.S_SlaveDatabase}{SlavePools.Count + 1}", slaveConnectionString, () => Interlocked.Decrement(ref slaveUnavailables), () => Interlocked.Increment(ref slaveUnavailables)); + new DbConnectionStringPool(base.DataType, $"{CoreStrings.S_SlaveDatabase}{SlavePools.Count + 1}", () => OracleConnectionPool.CreateConnection(slaveConnectionString)) as IObjectPool : + new OracleConnectionPool($"{CoreStrings.S_SlaveDatabase}{SlavePools.Count + 1}", slaveConnectionString, () => Interlocked.Decrement(ref slaveUnavailables), () => Interlocked.Increment(ref slaveUnavailables)); SlavePools.Add(slavePool); }); } diff --git a/Providers/FreeSql.Provider.Oracle/OracleExpression.cs b/Providers/FreeSql.Provider.Oracle/OracleExpression.cs index c96e20f9..474f9ee5 100644 --- a/Providers/FreeSql.Provider.Oracle/OracleExpression.cs +++ b/Providers/FreeSql.Provider.Oracle/OracleExpression.cs @@ -235,35 +235,6 @@ namespace FreeSql.Oracle } return null; } - public override string ExpressionLambdaToSqlMemberAccessTimeSpan(MemberExpression exp, ExpTSC tsc) - { - if (exp.Expression == null) - { - switch (exp.Member.Name) - { - case "Zero": return "numtodsinterval(0,'second')"; - case "MinValue": return "numtodsinterval(-233720368.5477580,'second')"; - case "MaxValue": return "numtodsinterval(233720368.5477580,'second')"; - } - return null; - } - var left = ExpressionLambdaToSql(exp.Expression, tsc); - switch (exp.Member.Name) - { - case "Days": return $"extract(day from {left})"; - case "Hours": return $"extract(hour from {left})"; - case "Milliseconds": return $"cast(substr(extract(second from {left})-floor(extract(second from {left})),3,3) as number)"; - case "Minutes": return $"extract(minute from {left})"; - case "Seconds": return $"floor(extract(second from {left}))"; - case "Ticks": return $"(extract(day from {left})*86400+extract(hour from {left})*3600+extract(minute from {left})*60+extract(second from {left}))*10000000"; - case "TotalDays": return $"extract(day from {left})"; - case "TotalHours": return $"(extract(day from {left})*24+extract(hour from {left}))"; - case "TotalMilliseconds": return $"(extract(day from {left})*86400+extract(hour from {left})*3600+extract(minute from {left})*60+extract(second from {left}))*1000"; - case "TotalMinutes": return $"(extract(day from {left})*1440+extract(hour from {left})*60+extract(minute from {left}))"; - case "TotalSeconds": return $"(extract(day from {left})*86400+extract(hour from {left})*3600+extract(minute from {left})*60+extract(second from {left}))"; - } - return null; - } public override string ExpressionLambdaToSqlCallString(MethodCallExpression exp, ExpTSC tsc) { @@ -439,7 +410,6 @@ namespace FreeSql.Oracle var args1 = exp.Arguments.Count == 0 ? null : getExp(exp.Arguments[0]); switch (exp.Method.Name) { - case "Add": return $"({left}+{args1})"; case "AddDays": return $"({left}+{args1})"; case "AddHours": return $"({left}+({args1})/24)"; case "AddMilliseconds": return $"({left}+({args1})/86400000)"; @@ -518,42 +488,6 @@ namespace FreeSql.Oracle } return null; } - public override string ExpressionLambdaToSqlCallTimeSpan(MethodCallExpression exp, ExpTSC tsc) - { - Func getExp = exparg => ExpressionLambdaToSql(exparg, tsc); - if (exp.Object == null) - { - switch (exp.Method.Name) - { - case "Compare": return $"extract(day from ({getExp(exp.Arguments[0])}-({getExp(exp.Arguments[1])})))"; - case "Equals": return $"({getExp(exp.Arguments[0])} = {getExp(exp.Arguments[1])})"; - case "FromDays": return $"numtodsinterval(({getExp(exp.Arguments[0])})*{(long)60 * 60 * 24},'second')"; - case "FromHours": return $"numtodsinterval(({getExp(exp.Arguments[0])})*{(long)60 * 60},'second')"; - case "FromMilliseconds": return $"numtodsinterval(({getExp(exp.Arguments[0])})/1000,'second')"; - case "FromMinutes": return $"numtodsinterval(({getExp(exp.Arguments[0])})*60,'second')"; - case "FromSeconds": return $"numtodsinterval(({getExp(exp.Arguments[0])}),'second')"; - case "FromTicks": return $"numtodsinterval(({getExp(exp.Arguments[0])})/10000000,'second')"; - case "Parse": return $"cast({getExp(exp.Arguments[0])} as interval day(9) to second(7))"; - case "ParseExact": - case "TryParse": - case "TryParseExact": return $"cast({getExp(exp.Arguments[0])} as interval day(9) to second(7))"; - } - } - else - { - var left = getExp(exp.Object); - var args1 = exp.Arguments.Count == 0 ? null : getExp(exp.Arguments[0]); - switch (exp.Method.Name) - { - case "Add": return $"({left}+{args1})"; - case "Subtract": return $"({left}-({args1}))"; - case "Equals": return $"({left} = {args1})"; - case "CompareTo": return $"extract(day from ({left}-({args1})))"; - case "ToString": return $"to_char({left})"; - } - } - return null; - } public override string ExpressionLambdaToSqlCallConvert(MethodCallExpression exp, ExpTSC tsc) { Func getExp = exparg => ExpressionLambdaToSql(exparg, tsc); diff --git a/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLAdo/PostgreSQLAdo.cs b/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLAdo/PostgreSQLAdo.cs index 6e964ce5..9be429d4 100644 --- a/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLAdo/PostgreSQLAdo.cs +++ b/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLAdo/PostgreSQLAdo.cs @@ -38,8 +38,8 @@ namespace FreeSql.PostgreSQL slaveConnectionStrings?.ToList().ForEach(slaveConnectionString => { var slavePool = isAdoPool ? - new DbConnectionStringPool(base.DataType, $"{CoreStrings.S_SlaveDatabase}{SlavePools.Count + 1}", () => new NpgsqlConnection(slaveConnectionString)) as IObjectPool : - new PostgreSQLConnectionPool($"{CoreStrings.S_SlaveDatabase}{SlavePools.Count + 1}", slaveConnectionString, () => Interlocked.Decrement(ref slaveUnavailables), () => Interlocked.Increment(ref slaveUnavailables)); + new DbConnectionStringPool(base.DataType, $"{CoreStrings.S_SlaveDatabase}{SlavePools.Count + 1}", () => new NpgsqlConnection(slaveConnectionString)) as IObjectPool : + new PostgreSQLConnectionPool($"{CoreStrings.S_SlaveDatabase}{SlavePools.Count + 1}", slaveConnectionString, () => Interlocked.Decrement(ref slaveUnavailables), () => Interlocked.Increment(ref slaveUnavailables)); SlavePools.Add(slavePool); }); } @@ -68,7 +68,10 @@ namespace FreeSql.PostgreSQL return AddslashesTypeHandler(typeof(DateTime?), param) ?? string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.ffffff"), "'"); else if (param is TimeSpan || param is TimeSpan?) - return ((TimeSpan)param).Ticks / 10; + { + var ts = (TimeSpan)param; + return $"'{Math.Min(24, (int)Math.Floor(ts.TotalHours))}:{ts.Minutes}:{ts.Seconds}'"; + } else if (param is byte[]) return $"'\\x{CommonUtils.BytesSqlRaw(param as byte[])}'"; else if (param is JToken || param is JObject || param is JArray) diff --git a/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLExpression.cs b/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLExpression.cs index 04570727..ea19d182 100644 --- a/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLExpression.cs +++ b/Providers/FreeSql.Provider.PostgreSQL/PostgreSQLExpression.cs @@ -350,35 +350,6 @@ namespace FreeSql.PostgreSQL } return null; } - public override string ExpressionLambdaToSqlMemberAccessTimeSpan(MemberExpression exp, ExpTSC tsc) - { - if (exp.Expression == null) - { - switch (exp.Member.Name) - { - case "Zero": return "0"; - case "MinValue": return "-922337203685477580"; //微秒 Ticks / 10 - case "MaxValue": return "922337203685477580"; - } - return null; - } - var left = ExpressionLambdaToSql(exp.Expression, tsc); - switch (exp.Member.Name) - { - case "Days": return $"floor(({left})/{(long)1000000 * 60 * 60 * 24})"; - case "Hours": return $"floor(({left})/{(long)1000000 * 60 * 60}%24)"; - case "Milliseconds": return $"(floor(({left})/1000)::int8%1000)"; - case "Minutes": return $"(floor(({left})/{(long)1000000 * 60})::int8%60)"; - case "Seconds": return $"(floor(({left})/1000000)::int8%60)"; - case "Ticks": return $"(({left})*10)"; - case "TotalDays": return $"(({left})/{(long)1000000 * 60 * 60 * 24})"; - case "TotalHours": return $"(({left})/{(long)1000000 * 60 * 60})"; - case "TotalMilliseconds": return $"(({left})/1000)"; - case "TotalMinutes": return $"(({left})/{(long)1000000 * 60})"; - case "TotalSeconds": return $"(({left})/1000000)"; - } - return null; - } public override string ExpressionLambdaToSqlCallString(MethodCallExpression exp, ExpTSC tsc) { @@ -559,7 +530,6 @@ namespace FreeSql.PostgreSQL var args1 = exp.Arguments.Count == 0 ? null : getExp(exp.Arguments[0]); switch (exp.Method.Name) { - case "Add": return $"(({left})::timestamp+((({args1})/1000)||' milliseconds')::interval)"; case "AddDays": return $"(({left})::timestamp+(({args1})||' day')::interval)"; case "AddHours": return $"(({left})::timestamp+(({args1})||' hour')::interval)"; case "AddMilliseconds": return $"(({left})::timestamp+(({args1})||' milliseconds')::interval)"; @@ -638,42 +608,6 @@ namespace FreeSql.PostgreSQL } return null; } - public override string ExpressionLambdaToSqlCallTimeSpan(MethodCallExpression exp, ExpTSC tsc) - { - Func getExp = exparg => ExpressionLambdaToSql(exparg, tsc); - if (exp.Object == null) - { - switch (exp.Method.Name) - { - case "Compare": return $"({getExp(exp.Arguments[0])}-({getExp(exp.Arguments[1])}))"; - case "Equals": return $"({getExp(exp.Arguments[0])} = {getExp(exp.Arguments[1])})"; - case "FromDays": return $"(({getExp(exp.Arguments[0])})*{(long)1000000 * 60 * 60 * 24})"; - case "FromHours": return $"(({getExp(exp.Arguments[0])})*{(long)1000000 * 60 * 60})"; - case "FromMilliseconds": return $"(({getExp(exp.Arguments[0])})*1000)"; - case "FromMinutes": return $"(({getExp(exp.Arguments[0])})*{(long)1000000 * 60})"; - case "FromSeconds": return $"(({getExp(exp.Arguments[0])})*1000000)"; - case "FromTicks": return $"(({getExp(exp.Arguments[0])})/10)"; - case "Parse": return $"({getExp(exp.Arguments[0])})::int8"; - case "ParseExact": - case "TryParse": - case "TryParseExact": return $"({getExp(exp.Arguments[0])})::int8"; - } - } - else - { - var left = getExp(exp.Object); - var args1 = exp.Arguments.Count == 0 ? null : getExp(exp.Arguments[0]); - switch (exp.Method.Name) - { - case "Add": return $"({left}+{args1})"; - case "Subtract": return $"({left}-({args1}))"; - case "Equals": return $"({left} = {args1})"; - case "CompareTo": return $"({left}-({args1}))"; - case "ToString": return $"({left})::varchar"; - } - } - return null; - } public override string ExpressionLambdaToSqlCallConvert(MethodCallExpression exp, ExpTSC tsc) { Func getExp = exparg => ExpressionLambdaToSql(exparg, tsc); diff --git a/Providers/FreeSql.Provider.QuestDb/QuestDbAdo/QuestDbAdo.cs b/Providers/FreeSql.Provider.QuestDb/QuestDbAdo/QuestDbAdo.cs index 5bcfeee4..90b8a456 100644 --- a/Providers/FreeSql.Provider.QuestDb/QuestDbAdo/QuestDbAdo.cs +++ b/Providers/FreeSql.Provider.QuestDb/QuestDbAdo/QuestDbAdo.cs @@ -38,8 +38,8 @@ namespace FreeSql.QuestDb slaveConnectionStrings?.ToList().ForEach(slaveConnectionString => { var slavePool = isAdoPool ? - new DbConnectionStringPool(base.DataType, $"{CoreStrings.S_SlaveDatabase}{SlavePools.Count + 1}", () => new NpgsqlConnection(slaveConnectionString)) as IObjectPool : - new QuestDbConnectionPool($"{CoreStrings.S_SlaveDatabase}{SlavePools.Count + 1}", slaveConnectionString, () => Interlocked.Decrement(ref slaveUnavailables), () => Interlocked.Increment(ref slaveUnavailables)); + new DbConnectionStringPool(base.DataType, $"{CoreStrings.S_SlaveDatabase}{SlavePools.Count + 1}", () => new NpgsqlConnection(slaveConnectionString)) as IObjectPool : + new QuestDbConnectionPool($"{CoreStrings.S_SlaveDatabase}{SlavePools.Count + 1}", slaveConnectionString, () => Interlocked.Decrement(ref slaveUnavailables), () => Interlocked.Increment(ref slaveUnavailables)); SlavePools.Add(slavePool); }); } @@ -70,7 +70,10 @@ namespace FreeSql.QuestDb return AddslashesTypeHandler(typeof(DateTime?), param) ?? string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.ffffff"), "'"); else if (param is TimeSpan || param is TimeSpan?) - return (long)((TimeSpan)param).TotalSeconds; + { + var ts = (TimeSpan)param; + return $"'{Math.Floor(ts.TotalHours)}:{ts.Minutes}:{ts.Seconds}'"; + } else if (param is byte[]) return $"'\\x{CommonUtils.BytesSqlRaw(param as byte[])}'"; else if (param is JToken || param is JObject || param is JArray) diff --git a/Providers/FreeSql.Provider.QuestDb/QuestDbExpression.cs b/Providers/FreeSql.Provider.QuestDb/QuestDbExpression.cs index 3d2a0617..edd41371 100644 --- a/Providers/FreeSql.Provider.QuestDb/QuestDbExpression.cs +++ b/Providers/FreeSql.Provider.QuestDb/QuestDbExpression.cs @@ -247,39 +247,6 @@ namespace FreeSql.QuestDb return null; } - public override string ExpressionLambdaToSqlMemberAccessTimeSpan(MemberExpression exp, ExpTSC tsc) - { - if (exp.Expression == null) - { - switch (exp.Member.Name) - { - case "Zero": return "0"; - case "MinValue": return "-922337203685477580"; //微秒 Ticks / 10 - case "MaxValue": return "922337203685477580"; - } - - return null; - } - - var left = ExpressionLambdaToSql(exp.Expression, tsc); - switch (exp.Member.Name) - { - case "Days": return $"floor(({left})/{60 * 60 * 24})"; - case "Hours": return $"floor(({left})/{60 * 60}%24)"; - case "Milliseconds": return $"0"; - case "Minutes": return $"(floor(({left})/60)%60)"; - case "Seconds": return $"(({left})%60)"; - case "Ticks": return $"(({left})*{(long)1000000 * 10})"; - case "TotalDays": return $"(({left})/{60 * 60 * 24})"; - case "TotalHours": return $"(({left})/{60 * 60})"; - case "TotalMilliseconds": return $"(({left})*1000)"; - case "TotalMinutes": return $"(({left})/60)"; - case "TotalSeconds": return $"({left})"; - } - - return null; - } - public override string ExpressionLambdaToSqlCallString(MethodCallExpression exp, ExpTSC tsc) { Func getExp = exparg => ExpressionLambdaToSql(exparg, tsc); @@ -476,7 +443,6 @@ namespace FreeSql.QuestDb var args1 = exp.Arguments.Count == 0 ? null : getExp(exp.Arguments[0]); switch (exp.Method.Name) { - case "Add": return $"dateadd('s',{args1},{left})"; case "AddDays": return $"dateadd('d',{args1},{left})"; case "AddHours": return $"dateadd('h',{args1},{left})"; case "AddMilliseconds": return $"dateadd('s',{args1}/1000,{left})"; @@ -546,44 +512,6 @@ namespace FreeSql.QuestDb return null; } - public override string ExpressionLambdaToSqlCallTimeSpan(MethodCallExpression exp, ExpTSC tsc) - { - Func getExp = exparg => ExpressionLambdaToSql(exparg, tsc); - if (exp.Object == null) - { - switch (exp.Method.Name) - { - case "Compare": return $"({getExp(exp.Arguments[0])}-({getExp(exp.Arguments[1])}))"; - case "Equals": return $"({getExp(exp.Arguments[0])} = {getExp(exp.Arguments[1])})"; - case "FromDays": return $"(({getExp(exp.Arguments[0])})*{60 * 60 * 24})"; - case "FromHours": return $"(({getExp(exp.Arguments[0])})*{60 * 60})"; - case "FromMilliseconds": return $"(({getExp(exp.Arguments[0])})/1000)"; - case "FromMinutes": return $"(({getExp(exp.Arguments[0])})*60)"; - case "FromSeconds": return $"({getExp(exp.Arguments[0])})"; - case "FromTicks": return $"(({getExp(exp.Arguments[0])})/10000000)"; - case "Parse": return $"cast({getExp(exp.Arguments[0])} as long)"; - case "ParseExact": - case "TryParse": - case "TryParseExact": return $"cast({getExp(exp.Arguments[0])} as long)"; - } - } - else - { - var left = getExp(exp.Object); - var args1 = exp.Arguments.Count == 0 ? null : getExp(exp.Arguments[0]); - switch (exp.Method.Name) - { - case "Add": return $"({left}+{args1})"; - case "Subtract": return $"({left}-({args1}))"; - case "Equals": return $"({left} = {args1})"; - case "CompareTo": return $"({left}-({args1}))"; - case "ToString": return $"cast({left} as string)"; - } - } - - return null; - } - public override string ExpressionLambdaToSqlCallConvert(MethodCallExpression exp, ExpTSC tsc) { Func getExp = exparg => ExpressionLambdaToSql(exparg, tsc); diff --git a/Providers/FreeSql.Provider.ShenTong/ShenTongAdo/ShenTongAdo.cs b/Providers/FreeSql.Provider.ShenTong/ShenTongAdo/ShenTongAdo.cs index 240d7b49..f60f5256 100644 --- a/Providers/FreeSql.Provider.ShenTong/ShenTongAdo/ShenTongAdo.cs +++ b/Providers/FreeSql.Provider.ShenTong/ShenTongAdo/ShenTongAdo.cs @@ -35,8 +35,8 @@ namespace FreeSql.ShenTong slaveConnectionStrings?.ToList().ForEach(slaveConnectionString => { var slavePool = isAdoPool ? - new DbConnectionStringPool(base.DataType, $"{CoreStrings.S_SlaveDatabase}{SlavePools.Count + 1}", () => new OscarConnection(slaveConnectionString)) as IObjectPool : - new ShenTongConnectionPool($"{CoreStrings.S_SlaveDatabase}{SlavePools.Count + 1}", slaveConnectionString, () => Interlocked.Decrement(ref slaveUnavailables), () => Interlocked.Increment(ref slaveUnavailables)); + new DbConnectionStringPool(base.DataType, $"{CoreStrings.S_SlaveDatabase}{SlavePools.Count + 1}", () => new OscarConnection(slaveConnectionString)) as IObjectPool : + new ShenTongConnectionPool($"{CoreStrings.S_SlaveDatabase}{SlavePools.Count + 1}", slaveConnectionString, () => Interlocked.Decrement(ref slaveUnavailables), () => Interlocked.Increment(ref slaveUnavailables)); SlavePools.Add(slavePool); }); } @@ -64,7 +64,12 @@ namespace FreeSql.ShenTong return AddslashesTypeHandler(typeof(DateTime?), param) ?? string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.ffffff"), "'"); else if (param is TimeSpan || param is TimeSpan?) - return ((TimeSpan)param).TotalSeconds; + { + var ts = (TimeSpan)param; + var hh = Math.Min(24, (int)Math.Floor(ts.TotalHours)); + if (hh >= 24) hh = 0; + return $"'{hh}:{ts.Minutes}:{ts.Seconds}.{ts.Milliseconds}'"; + } else if (param is byte[]) return $"0x{CommonUtils.BytesSqlRaw(param as byte[])}"; else if (param is IEnumerable) diff --git a/Providers/FreeSql.Provider.ShenTong/ShenTongExpression.cs b/Providers/FreeSql.Provider.ShenTong/ShenTongExpression.cs index 62754aff..862f3b2b 100644 --- a/Providers/FreeSql.Provider.ShenTong/ShenTongExpression.cs +++ b/Providers/FreeSql.Provider.ShenTong/ShenTongExpression.cs @@ -279,35 +279,6 @@ namespace FreeSql.ShenTong } return null; } - public override string ExpressionLambdaToSqlMemberAccessTimeSpan(MemberExpression exp, ExpTSC tsc) - { - if (exp.Expression == null) - { - switch (exp.Member.Name) - { - case "Zero": return "0"; - case "MinValue": return "-922337203685477580"; //微秒 Ticks / 10 - case "MaxValue": return "922337203685477580"; - } - return null; - } - var left = ExpressionLambdaToSql(exp.Expression, tsc); - switch (exp.Member.Name) - { - case "Days": return $"floor(({left})/{60 * 60 * 24})"; - case "Hours": return $"floor(({left})/{60 * 60}%24)"; - case "Milliseconds": return $"(({left})::int8*1000)"; - case "Minutes": return $"floor(({left})/60%60)"; - case "Seconds": return $"(({left})%60)"; - case "Ticks": return $"(({left})::int8*10000000)"; - case "TotalDays": return $"(({left})/{60 * 60 * 24})"; - case "TotalHours": return $"(({left})/{60 * 60})"; - case "TotalMilliseconds": return $"(({left})::int8*1000)"; - case "TotalMinutes": return $"(({left})/60)"; - case "TotalSeconds": return $"({left})"; - } - return null; - } public override string ExpressionLambdaToSqlCallString(MethodCallExpression exp, ExpTSC tsc) { @@ -483,7 +454,6 @@ namespace FreeSql.ShenTong var args1 = exp.Arguments.Count == 0 ? null : getExp(exp.Arguments[0]); switch (exp.Method.Name) { - case "Add": return $"dateadd('second',{args1},{left})"; case "AddDays": return $"dateadd('day',{args1},{left})"; case "AddHours": return $"dateadd('hour',{args1},{left})"; case "AddMilliseconds": return $"dateadd('second',({args1})/1000,{left})"; @@ -562,42 +532,6 @@ namespace FreeSql.ShenTong } return null; } - public override string ExpressionLambdaToSqlCallTimeSpan(MethodCallExpression exp, ExpTSC tsc) - { - Func getExp = exparg => ExpressionLambdaToSql(exparg, tsc); - if (exp.Object == null) - { - switch (exp.Method.Name) - { - case "Compare": return $"({getExp(exp.Arguments[0])}-({getExp(exp.Arguments[1])}))"; - case "Equals": return $"({getExp(exp.Arguments[0])} = {getExp(exp.Arguments[1])})"; - case "FromDays": return $"(({getExp(exp.Arguments[0])})*{60 * 60 * 24})"; - case "FromHours": return $"(({getExp(exp.Arguments[0])})*{60 * 60})"; - case "FromMilliseconds": return $"(({getExp(exp.Arguments[0])})/1000)"; - case "FromMinutes": return $"(({getExp(exp.Arguments[0])})*60)"; - case "FromSeconds": return $"({getExp(exp.Arguments[0])})"; - case "FromTicks": return $"(({getExp(exp.Arguments[0])})/10000000)"; - case "Parse": return $"({getExp(exp.Arguments[0])})::int8"; - case "ParseExact": - case "TryParse": - case "TryParseExact": return $"({getExp(exp.Arguments[0])})::int8"; - } - } - else - { - var left = getExp(exp.Object); - var args1 = exp.Arguments.Count == 0 ? null : getExp(exp.Arguments[0]); - switch (exp.Method.Name) - { - case "Add": return $"({left}+{args1})"; - case "Subtract": return $"({left}-({args1}))"; - case "Equals": return $"({left} = {args1})"; - case "CompareTo": return $"({left}-({args1}))"; - case "ToString": return $"({left})::text"; - } - } - return null; - } public override string ExpressionLambdaToSqlCallConvert(MethodCallExpression exp, ExpTSC tsc) { Func getExp = exparg => ExpressionLambdaToSql(exparg, tsc); diff --git a/Providers/FreeSql.Provider.SqlServer/SqlServerAdo/SqlServerAdo.cs b/Providers/FreeSql.Provider.SqlServer/SqlServerAdo/SqlServerAdo.cs index 426f09ef..be848d44 100644 --- a/Providers/FreeSql.Provider.SqlServer/SqlServerAdo/SqlServerAdo.cs +++ b/Providers/FreeSql.Provider.SqlServer/SqlServerAdo/SqlServerAdo.cs @@ -40,8 +40,8 @@ namespace FreeSql.SqlServer slaveConnectionStrings?.ToList().ForEach(slaveConnectionString => { var slavePool = isAdoPool ? - new DbConnectionStringPool(base.DataType, $"{CoreStrings.S_SlaveDatabase}{SlavePools.Count + 1}", () => new SqlConnection(slaveConnectionString)) as IObjectPool : - new SqlServerConnectionPool($"{CoreStrings.S_SlaveDatabase}{SlavePools.Count + 1}", slaveConnectionString, () => Interlocked.Decrement(ref slaveUnavailables), () => Interlocked.Increment(ref slaveUnavailables)); + new DbConnectionStringPool(base.DataType, $"{CoreStrings.S_SlaveDatabase}{SlavePools.Count + 1}", () => new SqlConnection(slaveConnectionString)) as IObjectPool : + new SqlServerConnectionPool($"{CoreStrings.S_SlaveDatabase}{SlavePools.Count + 1}", slaveConnectionString, () => Interlocked.Decrement(ref slaveUnavailables), () => Interlocked.Increment(ref slaveUnavailables)); SlavePools.Add(slavePool); }); } @@ -99,7 +99,10 @@ namespace FreeSql.SqlServer return ((TimeOnly)param).ToTimeSpan().TotalSeconds; #endif else if (param is TimeSpan || param is TimeSpan?) - return ((TimeSpan)param).TotalSeconds; + { + var ts = (TimeSpan)param; + return $"'{ts.Hours}:{ts.Minutes}:{ts.Seconds}.{ts.Milliseconds}'"; + } else if (param is byte[]) return $"0x{CommonUtils.BytesSqlRaw(param as byte[])}"; else if (param is IEnumerable) diff --git a/Providers/FreeSql.Provider.SqlServer/SqlServerExpression.cs b/Providers/FreeSql.Provider.SqlServer/SqlServerExpression.cs index 694e03f8..230fdcd7 100644 --- a/Providers/FreeSql.Provider.SqlServer/SqlServerExpression.cs +++ b/Providers/FreeSql.Provider.SqlServer/SqlServerExpression.cs @@ -240,35 +240,6 @@ namespace FreeSql.SqlServer } return null; } - public override string ExpressionLambdaToSqlMemberAccessTimeSpan(MemberExpression exp, ExpTSC tsc) - { - if (exp.Expression == null) - { - switch (exp.Member.Name) - { - case "Zero": return "0"; - case "MinValue": return "-922337203685477580"; //微秒 Ticks / 10 - case "MaxValue": return "922337203685477580"; - } - return null; - } - var left = ExpressionLambdaToSql(exp.Expression, tsc); - switch (exp.Member.Name) - { - case "Days": return $"floor(({left})/{60 * 60 * 24})"; - case "Hours": return $"floor(({left})/{60 * 60}%24)"; - case "Milliseconds": return $"(cast({left} as bigint)*1000)"; - case "Minutes": return $"floor(({left})/60%60)"; - case "Seconds": return $"(({left})%60)"; - case "Ticks": return $"(cast({left} as bigint)*10000000)"; - case "TotalDays": return $"(({left})/{60 * 60 * 24})"; - case "TotalHours": return $"(({left})/{60 * 60})"; - case "TotalMilliseconds": return $"(cast({left} as bigint)*1000)"; - case "TotalMinutes": return $"(({left})/60)"; - case "TotalSeconds": return $"({left})"; - } - return null; - } public override string ExpressionLambdaToSqlCallString(MethodCallExpression exp, ExpTSC tsc) { @@ -435,7 +406,6 @@ namespace FreeSql.SqlServer var args1 = exp.Arguments.Count == 0 ? null : getExp(exp.Arguments[0]); switch (exp.Method.Name) { - case "Add": return $"dateadd(second, {args1}, {left})"; case "AddDays": return $"dateadd(day, {args1}, {left})"; case "AddHours": return $"dateadd(hour, {args1}, {left})"; case "AddMilliseconds": return $"dateadd(second, ({args1})/1000, {left})"; @@ -501,42 +471,6 @@ namespace FreeSql.SqlServer } return null; } - public override string ExpressionLambdaToSqlCallTimeSpan(MethodCallExpression exp, ExpTSC tsc) - { - Func getExp = exparg => ExpressionLambdaToSql(exparg, tsc); - if (exp.Object == null) - { - switch (exp.Method.Name) - { - case "Compare": return $"({getExp(exp.Arguments[0])}-({getExp(exp.Arguments[1])}))"; - case "Equals": return $"({getExp(exp.Arguments[0])} = {getExp(exp.Arguments[1])})"; - case "FromDays": return $"(({getExp(exp.Arguments[0])})*{60 * 60 * 24})"; - case "FromHours": return $"(({getExp(exp.Arguments[0])})*{60 * 60})"; - case "FromMilliseconds": return $"(({getExp(exp.Arguments[0])})/1000)"; - case "FromMinutes": return $"(({getExp(exp.Arguments[0])})*60)"; - case "FromSeconds": return $"({getExp(exp.Arguments[0])})"; - case "FromTicks": return $"(({getExp(exp.Arguments[0])})/10000000)"; - case "Parse": return $"cast({getExp(exp.Arguments[0])} as bigint)"; - case "ParseExact": - case "TryParse": - case "TryParseExact": return $"cast({getExp(exp.Arguments[0])} as bigint)"; - } - } - else - { - var left = getExp(exp.Object); - var args1 = exp.Arguments.Count == 0 ? null : getExp(exp.Arguments[0]); - switch (exp.Method.Name) - { - case "Add": return $"({left}+{args1})"; - case "Subtract": return $"({left}-({args1}))"; - case "Equals": return $"({left} = {args1})"; - case "CompareTo": return $"({left}-({args1}))"; - case "ToString": return $"cast({left} as varchar(100))"; - } - } - return null; - } public override string ExpressionLambdaToSqlCallConvert(MethodCallExpression exp, ExpTSC tsc) { Func getExp = exparg => ExpressionLambdaToSql(exparg, tsc); diff --git a/Providers/FreeSql.Provider.Sqlite/SqliteAdo/SqliteAdo.cs b/Providers/FreeSql.Provider.Sqlite/SqliteAdo/SqliteAdo.cs index 89670b97..10c37d11 100644 --- a/Providers/FreeSql.Provider.Sqlite/SqliteAdo/SqliteAdo.cs +++ b/Providers/FreeSql.Provider.Sqlite/SqliteAdo/SqliteAdo.cs @@ -41,8 +41,8 @@ namespace FreeSql.Sqlite slaveConnectionStrings?.ToList().ForEach(slaveConnectionString => { var slavePool = isAdoPool ? - new DbConnectionStringPool(base.DataType, $"{CoreStrings.S_SlaveDatabase}{SlavePools.Count + 1}", () => SqliteConnectionPool.CreateConnection(slaveConnectionString)) as IObjectPool : - new SqliteConnectionPool($"{CoreStrings.S_SlaveDatabase}{SlavePools.Count + 1}", slaveConnectionString, () => Interlocked.Decrement(ref slaveUnavailables), () => Interlocked.Increment(ref slaveUnavailables)); + new DbConnectionStringPool(base.DataType, $"{CoreStrings.S_SlaveDatabase}{SlavePools.Count + 1}", () => SqliteConnectionPool.CreateConnection(slaveConnectionString)) as IObjectPool : + new SqliteConnectionPool($"{CoreStrings.S_SlaveDatabase}{SlavePools.Count + 1}", slaveConnectionString, () => Interlocked.Decrement(ref slaveUnavailables), () => Interlocked.Increment(ref slaveUnavailables)); SlavePools.Add(slavePool); }); } diff --git a/Providers/FreeSql.Provider.Sqlite/SqliteExpression.cs b/Providers/FreeSql.Provider.Sqlite/SqliteExpression.cs index 2f27449b..dc905764 100644 --- a/Providers/FreeSql.Provider.Sqlite/SqliteExpression.cs +++ b/Providers/FreeSql.Provider.Sqlite/SqliteExpression.cs @@ -231,35 +231,6 @@ namespace FreeSql.Sqlite } return null; } - public override string ExpressionLambdaToSqlMemberAccessTimeSpan(MemberExpression exp, ExpTSC tsc) - { - if (exp.Expression == null) - { - switch (exp.Member.Name) - { - case "Zero": return "0"; - case "MinValue": return "-922337203685.477580"; //秒 Ticks / 1000,000,0 - case "MaxValue": return "922337203685.477580"; - } - return null; - } - var left = ExpressionLambdaToSql(exp.Expression, tsc); - switch (exp.Member.Name) - { - case "Days": return $"floor(({left})/{60 * 60 * 24})"; - case "Hours": return $"floor(({left})/{60 * 60}%24)"; - case "Milliseconds": return $"(cast({left} as bigint)*1000)"; - case "Minutes": return $"floor(({left})/60%60)"; - case "Seconds": return $"(({left})%60)"; - case "Ticks": return $"(cast({left} as bigint)*10000000)"; - case "TotalDays": return $"(({left})/{60 * 60 * 24})"; - case "TotalHours": return $"(({left})/{60 * 60})"; - case "TotalMilliseconds": return $"(cast({left} as bigint)*1000)"; - case "TotalMinutes": return $"(({left})/60)"; - case "TotalSeconds": return $"({left})"; - } - return null; - } public override string ExpressionLambdaToSqlCallString(MethodCallExpression exp, ExpTSC tsc) { @@ -451,7 +422,6 @@ namespace FreeSql.Sqlite var args1 = exp.Arguments.Count == 0 ? null : getExp(exp.Arguments[0]); switch (exp.Method.Name) { - case "Add": return $"datetime({left},({args1})||' seconds')"; case "AddDays": return $"datetime({left},({args1})||' days')"; case "AddHours": return $"datetime({left},({args1})||' hours')"; case "AddMilliseconds": return $"datetime({left},(({args1})/1000)||' seconds')"; @@ -529,42 +499,6 @@ namespace FreeSql.Sqlite } return null; } - public override string ExpressionLambdaToSqlCallTimeSpan(MethodCallExpression exp, ExpTSC tsc) - { - Func getExp = exparg => ExpressionLambdaToSql(exparg, tsc); - if (exp.Object == null) - { - switch (exp.Method.Name) - { - case "Compare": return $"({getExp(exp.Arguments[0])}-({getExp(exp.Arguments[1])}))"; - case "Equals": return $"({getExp(exp.Arguments[0])} = {getExp(exp.Arguments[1])})"; - case "FromDays": return $"(({getExp(exp.Arguments[0])})*{60 * 60 * 24})"; - case "FromHours": return $"(({getExp(exp.Arguments[0])})*{60 * 60})"; - case "FromMilliseconds": return $"(({getExp(exp.Arguments[0])})/1000)"; - case "FromMinutes": return $"(({getExp(exp.Arguments[0])})*60)"; - case "FromSeconds": return $"(({getExp(exp.Arguments[0])}))"; - case "FromTicks": return $"(({getExp(exp.Arguments[0])})/10000000)"; - case "Parse": return $"cast({getExp(exp.Arguments[0])} as bigint)"; - case "ParseExact": - case "TryParse": - case "TryParseExact": return $"cast({getExp(exp.Arguments[0])} as bigint)"; - } - } - else - { - var left = getExp(exp.Object); - var args1 = exp.Arguments.Count == 0 ? null : getExp(exp.Arguments[0]); - switch (exp.Method.Name) - { - case "Add": return $"({left}+{args1})"; - case "Subtract": return $"({left}-({args1}))"; - case "Equals": return $"({left} = {args1})"; - case "CompareTo": return $"({left}-({args1}))"; - case "ToString": return $"cast({left} as character)"; - } - } - return null; - } public override string ExpressionLambdaToSqlCallConvert(MethodCallExpression exp, ExpTSC tsc) { Func getExp = exparg => ExpressionLambdaToSql(exparg, tsc); diff --git a/Providers/FreeSql.Provider.Xugu/XuguAdo/XuguAdo.cs b/Providers/FreeSql.Provider.Xugu/XuguAdo/XuguAdo.cs index fd2d9340..e780875d 100644 --- a/Providers/FreeSql.Provider.Xugu/XuguAdo/XuguAdo.cs +++ b/Providers/FreeSql.Provider.Xugu/XuguAdo/XuguAdo.cs @@ -36,8 +36,8 @@ namespace FreeSql.Xugu slaveConnectionStrings?.ToList().ForEach(slaveConnectionString => { var slavePool = isAdoPool ? - new DbConnectionStringPool(base.DataType, $"{CoreStrings.S_SlaveDatabase}{SlavePools.Count + 1}", () => new XGConnection(slaveConnectionString)) as IObjectPool : - new XuguConnectionPool($"{CoreStrings.S_SlaveDatabase}{SlavePools.Count + 1}", slaveConnectionString, () => Interlocked.Decrement(ref slaveUnavailables), () => Interlocked.Increment(ref slaveUnavailables)); + new DbConnectionStringPool(base.DataType, $"{CoreStrings.S_SlaveDatabase}{SlavePools.Count + 1}", () => new XGConnection(slaveConnectionString)) as IObjectPool : + new XuguConnectionPool($"{CoreStrings.S_SlaveDatabase}{SlavePools.Count + 1}", slaveConnectionString, () => Interlocked.Decrement(ref slaveUnavailables), () => Interlocked.Increment(ref slaveUnavailables)); SlavePools.Add(slavePool); }); } @@ -48,7 +48,6 @@ namespace FreeSql.Xugu if (mapType != null && mapType != param.GetType() && (param is IEnumerable == false || param is JToken || param is JObject || param is JArray)) param = Utils.GetDataReaderValue(mapType, param); - bool isdic; if (param is bool || param is bool?) return (bool)param ? "'t'" : "'f'"; else if (param is string) @@ -66,7 +65,10 @@ namespace FreeSql.Xugu return AddslashesTypeHandler(typeof(DateTime?), param) ?? string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.ffffff"), "'"); else if (param is TimeSpan || param is TimeSpan?) - return ((TimeSpan)param).Ticks / 10; + { + var ts = (TimeSpan)param; + return $"'{Math.Min(24, (int)Math.Floor(ts.TotalHours))}:{ts.Minutes}:{ts.Seconds}'"; + } else if (param is byte[]) return $"'\\x{CommonUtils.BytesSqlRaw(param as byte[])}'"; else if (param is IEnumerable) diff --git a/Providers/FreeSql.Provider.Xugu/XuguExpression.cs b/Providers/FreeSql.Provider.Xugu/XuguExpression.cs index a703a963..cb564185 100644 --- a/Providers/FreeSql.Provider.Xugu/XuguExpression.cs +++ b/Providers/FreeSql.Provider.Xugu/XuguExpression.cs @@ -277,35 +277,6 @@ namespace FreeSql.Xugu } return null; } - public override string ExpressionLambdaToSqlMemberAccessTimeSpan(MemberExpression exp, ExpTSC tsc) - { - if (exp.Expression == null) - { - switch (exp.Member.Name) - { - case "Zero": return "0"; - case "MinValue": return "-922337203685477580"; //微秒 Ticks / 10 - case "MaxValue": return "922337203685477580"; - } - return null; - } - var left = ExpressionLambdaToSql(exp.Expression, tsc); - switch (exp.Member.Name) - { - case "Days": return $"floor(({left})/{60 * 60 * 24})"; - case "Hours": return $"floor(({left})/{60 * 60}%24)"; - case "Milliseconds": return $"(cast({left} as bigint)*1000)"; - case "Minutes": return $"floor(({left})/60%60)"; - case "Seconds": return $"(({left})%60)"; - case "Ticks": return $"(cast({left} as bigint)*10000000)"; - case "TotalDays": return $"(({left})/{60 * 60 * 24})"; - case "TotalHours": return $"(({left})/{60 * 60})"; - case "TotalMilliseconds": return $"(cast({left} as bigint)*1000)"; - case "TotalMinutes": return $"(({left})/60)"; - case "TotalSeconds": return $"({left})"; - } - return null; - } public override string ExpressionLambdaToSqlCallString(MethodCallExpression exp, ExpTSC tsc) { @@ -484,7 +455,6 @@ namespace FreeSql.Xugu var args1 = exp.Arguments.Count == 0 ? null : getExp(exp.Arguments[0]); switch (exp.Method.Name) { - case "Add": return $"date_add({left}, interval '{args1}' microsecond)"; case "AddDays": return $"date_add({left}, interval '{args1}' day)"; case "AddHours": return $"date_add({left}, interval '{args1}' hour)"; case "AddMilliseconds": return $"date_add({left}, interval '{args1}'*1000 microsecond)"; @@ -562,42 +532,6 @@ namespace FreeSql.Xugu } return null; } - public override string ExpressionLambdaToSqlCallTimeSpan(MethodCallExpression exp, ExpTSC tsc) - { - Func getExp = exparg => ExpressionLambdaToSql(exparg, tsc); - if (exp.Object == null) - { - switch (exp.Method.Name) - { - case "Compare": return $"({getExp(exp.Arguments[0])}-({getExp(exp.Arguments[1])}))"; - case "Equals": return $"({getExp(exp.Arguments[0])} = {getExp(exp.Arguments[1])})"; - case "FromDays": return $"(({getExp(exp.Arguments[0])})*{60 * 60 * 24})"; - case "FromHours": return $"(({getExp(exp.Arguments[0])})*{60 * 60})"; - case "FromMilliseconds": return $"(({getExp(exp.Arguments[0])})/1000)"; - case "FromMinutes": return $"(({getExp(exp.Arguments[0])})*60)"; - case "FromSeconds": return $"({getExp(exp.Arguments[0])})"; - case "FromTicks": return $"(({getExp(exp.Arguments[0])})/10000000)"; - case "Parse": return $"cast({getExp(exp.Arguments[0])} as bigint)"; - case "ParseExact": - case "TryParse": - case "TryParseExact": return $"cast({getExp(exp.Arguments[0])} as bigint)"; - } - } - else - { - var left = getExp(exp.Object); - var args1 = exp.Arguments.Count == 0 ? null : getExp(exp.Arguments[0]); - switch (exp.Method.Name) - { - case "Add": return $"({left}+{args1})"; - case "Subtract": return $"({left}-({args1}))"; - case "Equals": return $"({left} = {args1})"; - case "CompareTo": return $"({left}-({args1}))"; - case "ToString": return $"cast({left} as varchar(100))"; - } - } - return null; - } public override string ExpressionLambdaToSqlCallConvert(MethodCallExpression exp, ExpTSC tsc) { Func getExp = exparg => ExpressionLambdaToSql(exparg, tsc);