mirror of
				https://github.com/nsnail/FreeSql.git
				synced 2025-11-04 17:20:49 +08:00 
			
		
		
		
	- 移除 TimeSpan 过度 Lambda 解析;
This commit is contained in:
		@@ -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<DbConnection> :
 | 
			
		||||
                        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<DbConnection> :
 | 
			
		||||
                    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)
 | 
			
		||||
 
 | 
			
		||||
@@ -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<Expression, string> 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<Expression, string> getExp = exparg => ExpressionLambdaToSql(exparg, tsc);
 | 
			
		||||
 
 | 
			
		||||
@@ -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})";
 | 
			
		||||
 
 | 
			
		||||
@@ -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<Expression, string> 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<Expression, string> 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<Expression, string> getExp = exparg => ExpressionLambdaToSql(exparg, tsc);
 | 
			
		||||
 
 | 
			
		||||
@@ -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)
 | 
			
		||||
 
 | 
			
		||||
@@ -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<Expression, string> 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<Expression, string> getExp = exparg => ExpressionLambdaToSql(exparg, tsc);
 | 
			
		||||
 
 | 
			
		||||
@@ -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<Expression, string> 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<Expression, string> getExp = exparg => ExpressionLambdaToSql(exparg, tsc);
 | 
			
		||||
 
 | 
			
		||||
@@ -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)
 | 
			
		||||
 
 | 
			
		||||
@@ -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<Expression, string> 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<Expression, string> getExp = exparg => ExpressionLambdaToSql(exparg, tsc);
 | 
			
		||||
 
 | 
			
		||||
@@ -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)
 | 
			
		||||
 
 | 
			
		||||
@@ -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<Expression, string> 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<Expression, string> getExp = exparg => ExpressionLambdaToSql(exparg, tsc);
 | 
			
		||||
 
 | 
			
		||||
@@ -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<DbConnection> :
 | 
			
		||||
                        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<DbConnection> :
 | 
			
		||||
                    new DamengConnectionPool($"{CoreStrings.S_SlaveDatabase}{SlavePools.Count + 1}", slaveConnectionString, () => Interlocked.Decrement(ref slaveUnavailables), () => Interlocked.Increment(ref slaveUnavailables));
 | 
			
		||||
                SlavePools.Add(slavePool);
 | 
			
		||||
            });
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
@@ -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<Expression, string> 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<Expression, string> getExp = exparg => ExpressionLambdaToSql(exparg, tsc);
 | 
			
		||||
 
 | 
			
		||||
@@ -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<DbConnection> :
 | 
			
		||||
                        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<DbConnection> :
 | 
			
		||||
                    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)
 | 
			
		||||
 
 | 
			
		||||
@@ -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<Expression, string> 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<Expression, string> getExp = exparg => ExpressionLambdaToSql(exparg, tsc);
 | 
			
		||||
 
 | 
			
		||||
@@ -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<DbConnection> :
 | 
			
		||||
                        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<DbConnection> :
 | 
			
		||||
                    new GBaseConnectionPool($"{CoreStrings.S_SlaveDatabase}{SlavePools.Count + 1}", slaveConnectionString, () => Interlocked.Decrement(ref slaveUnavailables), () => Interlocked.Increment(ref slaveUnavailables));
 | 
			
		||||
                SlavePools.Add(slavePool);
 | 
			
		||||
            });
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
@@ -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<Expression, string> 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<Expression, string> getExp = exparg => ExpressionLambdaToSql(exparg, tsc);
 | 
			
		||||
 
 | 
			
		||||
@@ -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<DbConnection> :
 | 
			
		||||
                        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<DbConnection> :
 | 
			
		||||
                    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)
 | 
			
		||||
 
 | 
			
		||||
@@ -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<Expression, string> 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<Expression, string> getExp = exparg => ExpressionLambdaToSql(exparg, tsc);
 | 
			
		||||
 
 | 
			
		||||
@@ -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<DbConnection> :
 | 
			
		||||
                        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<DbConnection> :
 | 
			
		||||
                    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)
 | 
			
		||||
 
 | 
			
		||||
@@ -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<Expression, string> 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<Expression, string> getExp = exparg => ExpressionLambdaToSql(exparg, tsc);
 | 
			
		||||
 
 | 
			
		||||
@@ -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<DbConnection> :
 | 
			
		||||
                        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<DbConnection> :
 | 
			
		||||
                    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)
 | 
			
		||||
 
 | 
			
		||||
@@ -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<Expression, string> 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<Expression, string> getExp = exparg => ExpressionLambdaToSql(exparg, tsc);
 | 
			
		||||
 
 | 
			
		||||
@@ -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<DbConnection> :
 | 
			
		||||
                        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<DbConnection> :
 | 
			
		||||
                    new OdbcDamengConnectionPool($"{CoreStrings.S_SlaveDatabase}{SlavePools.Count + 1}", slaveConnectionString, () => Interlocked.Decrement(ref slaveUnavailables), () => Interlocked.Increment(ref slaveUnavailables));
 | 
			
		||||
                SlavePools.Add(slavePool);
 | 
			
		||||
            });
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
@@ -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<Expression, string> 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<Expression, string> getExp = exparg => ExpressionLambdaToSql(exparg, tsc);
 | 
			
		||||
 
 | 
			
		||||
@@ -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})";
 | 
			
		||||
 
 | 
			
		||||
@@ -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<DbConnection> :
 | 
			
		||||
                        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<DbConnection> :
 | 
			
		||||
                    new OdbcConnectionPool($"{CoreStrings.S_SlaveDatabase}{SlavePools.Count + 1}", slaveConnectionString, () => Interlocked.Decrement(ref slaveUnavailables), () => Interlocked.Increment(ref slaveUnavailables));
 | 
			
		||||
                SlavePools.Add(slavePool);
 | 
			
		||||
            });
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
@@ -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<Expression, string> 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<Expression, string> getExp = exparg => ExpressionLambdaToSql(exparg, tsc);
 | 
			
		||||
 
 | 
			
		||||
@@ -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<DbConnection> :
 | 
			
		||||
                        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<DbConnection> :
 | 
			
		||||
                    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)
 | 
			
		||||
 
 | 
			
		||||
@@ -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<Expression, string> 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<Expression, string> getExp = exparg => ExpressionLambdaToSql(exparg, tsc);
 | 
			
		||||
 
 | 
			
		||||
@@ -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<DbConnection> :
 | 
			
		||||
                        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<DbConnection> :
 | 
			
		||||
                    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)
 | 
			
		||||
 
 | 
			
		||||
@@ -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<Expression, string> 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<Expression, string> getExp = exparg => ExpressionLambdaToSql(exparg, tsc);
 | 
			
		||||
 
 | 
			
		||||
@@ -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<DbConnection> :
 | 
			
		||||
                        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<DbConnection> :
 | 
			
		||||
                    new OdbcOracleConnectionPool($"{CoreStrings.S_SlaveDatabase}{SlavePools.Count + 1}", slaveConnectionString, () => Interlocked.Decrement(ref slaveUnavailables), () => Interlocked.Increment(ref slaveUnavailables));
 | 
			
		||||
                SlavePools.Add(slavePool);
 | 
			
		||||
            });
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
@@ -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<Expression, string> 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<Expression, string> getExp = exparg => ExpressionLambdaToSql(exparg, tsc);
 | 
			
		||||
 
 | 
			
		||||
@@ -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<DbConnection> :
 | 
			
		||||
                        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<DbConnection> :
 | 
			
		||||
                    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)
 | 
			
		||||
 
 | 
			
		||||
@@ -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<Expression, string> 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<Expression, string> getExp = exparg => ExpressionLambdaToSql(exparg, tsc);
 | 
			
		||||
 
 | 
			
		||||
@@ -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<DbConnection> :
 | 
			
		||||
                        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<DbConnection> :
 | 
			
		||||
                    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)
 | 
			
		||||
 
 | 
			
		||||
@@ -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<Expression, string> 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<Expression, string> getExp = exparg => ExpressionLambdaToSql(exparg, tsc);
 | 
			
		||||
 
 | 
			
		||||
@@ -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<DbConnection> :
 | 
			
		||||
                        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<DbConnection> :
 | 
			
		||||
                    new OracleConnectionPool($"{CoreStrings.S_SlaveDatabase}{SlavePools.Count + 1}", slaveConnectionString, () => Interlocked.Decrement(ref slaveUnavailables), () => Interlocked.Increment(ref slaveUnavailables));
 | 
			
		||||
                SlavePools.Add(slavePool);
 | 
			
		||||
            });
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
@@ -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<Expression, string> 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<Expression, string> getExp = exparg => ExpressionLambdaToSql(exparg, tsc);
 | 
			
		||||
 
 | 
			
		||||
@@ -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<DbConnection> :
 | 
			
		||||
                        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<DbConnection> :
 | 
			
		||||
                    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)
 | 
			
		||||
 
 | 
			
		||||
@@ -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<Expression, string> 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<Expression, string> getExp = exparg => ExpressionLambdaToSql(exparg, tsc);
 | 
			
		||||
 
 | 
			
		||||
@@ -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<DbConnection> :
 | 
			
		||||
                        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<DbConnection> :
 | 
			
		||||
                    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)
 | 
			
		||||
 
 | 
			
		||||
@@ -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<Expression, string> 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<Expression, string> 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<Expression, string> getExp = exparg => ExpressionLambdaToSql(exparg, tsc);
 | 
			
		||||
 
 | 
			
		||||
@@ -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<DbConnection> :
 | 
			
		||||
                        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<DbConnection> :
 | 
			
		||||
                    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)
 | 
			
		||||
 
 | 
			
		||||
@@ -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<Expression, string> 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<Expression, string> getExp = exparg => ExpressionLambdaToSql(exparg, tsc);
 | 
			
		||||
 
 | 
			
		||||
@@ -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<DbConnection> :
 | 
			
		||||
                        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<DbConnection> :
 | 
			
		||||
                    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)
 | 
			
		||||
 
 | 
			
		||||
@@ -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<Expression, string> 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<Expression, string> getExp = exparg => ExpressionLambdaToSql(exparg, tsc);
 | 
			
		||||
 
 | 
			
		||||
@@ -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<DbConnection> :
 | 
			
		||||
                        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<DbConnection> :
 | 
			
		||||
                    new SqliteConnectionPool($"{CoreStrings.S_SlaveDatabase}{SlavePools.Count + 1}", slaveConnectionString, () => Interlocked.Decrement(ref slaveUnavailables), () => Interlocked.Increment(ref slaveUnavailables));
 | 
			
		||||
                SlavePools.Add(slavePool);
 | 
			
		||||
            });
 | 
			
		||||
        }
 | 
			
		||||
 
 | 
			
		||||
@@ -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<Expression, string> 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<Expression, string> getExp = exparg => ExpressionLambdaToSql(exparg, tsc);
 | 
			
		||||
 
 | 
			
		||||
@@ -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<DbConnection> :
 | 
			
		||||
                        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<DbConnection> :
 | 
			
		||||
                    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)
 | 
			
		||||
 
 | 
			
		||||
@@ -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<Expression, string> 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<Expression, string> getExp = exparg => ExpressionLambdaToSql(exparg, tsc);
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user