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);