mirror of
				https://github.com/nsnail/FreeSql.git
				synced 2025-11-04 17:20:49 +08:00 
			
		
		
		
	- 移除 TimeSpan 过度 Lambda 解析;
This commit is contained in:
		@@ -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);
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user