Skip to content

Commit 53443dc

Browse files
committed
- 优化 TypeHandlers 支持 Enum 枚举映射规则;#1634
1 parent 91362ad commit 53443dc

File tree

34 files changed

+120
-529
lines changed

34 files changed

+120
-529
lines changed

FreeSql/FreeSql.xml

Lines changed: 0 additions & 302 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

FreeSql/FreeSqlBuilder.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -603,7 +603,7 @@ public IFreeSql<TMark> Build<TMark>()
603603
Expression.TypeIs(valueExp, type2),
604604
Expression.Return(returnTarget, valueExp),
605605
Expression.Return(returnTarget, Expression.Convert(valueExpRet, typeof(object))) //此时不能设置 type2
606-
);
606+
);
607607
}
608608
return null;
609609
});

FreeSql/Internal/CommonProvider/AdoProvider/AdoProviderUtils.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,16 @@ namespace FreeSql.Internal.CommonProvider
1010
{
1111
partial class AdoProvider
1212
{
13+
public object AddslashesTypeHandler(Type type, object param)
14+
{
15+
if (Utils.TypeHandlers.TryGetValue(type, out var typeHandler))
16+
{
17+
var result = typeHandler.Serialize(param);
18+
return AddslashesProcessParam(result, null, null);
19+
}
20+
return null;
21+
}
22+
1323
public abstract object AddslashesProcessParam(object param, Type mapType, ColumnInfo mapColumn);
1424
public string Addslashes(string filter, params object[] parms)
1525
{

FreeSql/Internal/UtilsExpressionTree.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2509,7 +2509,7 @@ Expression LocalFuncGetExpression(bool ignoreArray = false)
25092509
);
25102510
break;
25112511
default:
2512-
if (type.IsEnum)
2512+
if (type.IsEnum && TypeHandlers.ContainsKey(type) == false)
25132513
return Expression.Block(
25142514
Expression.IfThenElse(
25152515
Expression.Equal(Expression.TypeAs(valueExp, typeof(string)), Expression.Constant(string.Empty)),

Providers/FreeSql.Provider.ClickHouse/ClickHouseAdo/ClickHouseAdo.cs

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -54,20 +54,14 @@ public override object AddslashesProcessParam(object param, Type mapType, Column
5454
else if (param is char)
5555
return string.Concat("'", param.ToString().Replace("'", "''").Replace("\\", "\\\\").Replace('\0', ' '), "'");
5656
else if (param is Enum)
57-
return string.Concat("'", param.ToString().Replace("'", "''").Replace("\\", "\\\\"), "'"); //((Enum)val).ToInt64();
57+
return AddslashesTypeHandler(param.GetType(), param) ?? string.Concat("'", param.ToString().Replace("'", "''").Replace("\\", "\\\\"), "'"); //((Enum)val).ToInt64();
5858
else if (decimal.TryParse(string.Concat(param), out var trydec))
5959
return param;
6060

6161
else if (param is DateTime)
62-
{
63-
if (Utils.TypeHandlers.TryGetValue(typeof(DateTime), out var typeHandler)) return typeHandler.Serialize(param);
64-
return string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss"), "'");
65-
}
62+
return AddslashesTypeHandler(typeof(DateTime), param) ?? string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss"), "'");
6663
else if (param is DateTime?)
67-
{
68-
if (Utils.TypeHandlers.TryGetValue(typeof(DateTime?), out var typeHandler)) return typeHandler.Serialize(param);
69-
return string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss"), "'");
70-
}
64+
return AddslashesTypeHandler(typeof(DateTime?), param) ?? string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss"), "'");
7165

7266
else if (param is TimeSpan || param is TimeSpan?)
7367
return ((TimeSpan)param).Ticks / 10;

Providers/FreeSql.Provider.Custom/CustomAdapter.cs

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,9 +51,6 @@ public virtual string DateTimeRawSql(object value)
5151
{
5252
if (value == null) return "NULL";
5353
if (value.Equals(DateTime.MinValue) == true) value = new DateTime(1970, 1, 1);
54-
55-
if (value is DateTime && Utils.TypeHandlers.TryGetValue(typeof(DateTime), out var typeHandler)) return typeHandler.Serialize(value)?.ToString();
56-
if (value is DateTime? && Utils.TypeHandlers.TryGetValue(typeof(DateTime?), out var typeHandler2)) return typeHandler2.Serialize(value)?.ToString();
5754
return string.Concat("'", ((DateTime)value).ToString("yyyy-MM-dd HH:mm:ss"), "'");
5855
}
5956
public virtual string TimeSpanRawSql(object value) => value == null ? "NULL" : ((TimeSpan)value).TotalSeconds.ToString();

Providers/FreeSql.Provider.Custom/CustomAdo/CustomAdo.cs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -40,12 +40,14 @@ public override object AddslashesProcessParam(object param, Type mapType, Column
4040
return Adapter.UnicodeStringRawSql(param, mapColumn);
4141
else if (param is char)
4242
return string.Concat("'", param.ToString().Replace("'", "''").Replace('\0', ' '), "'");
43-
else if (param is Enum)
44-
return ((Enum)param).ToInt64();
43+
else if (param is Enum)
44+
return AddslashesTypeHandler(param.GetType(), param) ?? ((Enum)param).ToInt64();
4545
else if (decimal.TryParse(string.Concat(param), out var trydec))
4646
return param;
47-
else if (param is DateTime || param is DateTime?)
48-
return Adapter.DateTimeRawSql(param);
47+
else if (param is DateTime)
48+
return AddslashesTypeHandler(typeof(DateTime), param) ?? Adapter.DateTimeRawSql(param);
49+
else if (param is DateTime?)
50+
return AddslashesTypeHandler(typeof(DateTime?), param) ?? Adapter.DateTimeRawSql(param);
4951
else if (param is TimeSpan || param is TimeSpan?)
5052
return Adapter.TimeSpanRawSql(param);
5153
else if (param is byte[])

Providers/FreeSql.Provider.Custom/MySql/CustomMySqlAdo/CustomMySqlAdo.cs

Lines changed: 4 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -39,26 +39,20 @@ public override object AddslashesProcessParam(object param, Type mapType, Column
3939
else if (param is char)
4040
return string.Concat("'", param.ToString().Replace("'", "''").Replace("\\", "\\\\").Replace('\0', ' '), "'");
4141
else if (param is Enum)
42-
return string.Concat("'", param.ToString().Replace("'", "''").Replace("\\", "\\\\").Replace(", ", ","), "'"); //((Enum)val).ToInt64();
42+
return AddslashesTypeHandler(param.GetType(), param) ?? string.Concat("'", param.ToString().Replace("'", "''").Replace("\\", "\\\\").Replace(", ", ","), "'"); //((Enum)val).ToInt64();
4343
else if (decimal.TryParse(string.Concat(param), out var trydec))
4444
return param;
4545

4646
else if (param is DateTime)
47-
{
48-
if (Utils.TypeHandlers.TryGetValue(typeof(DateTime), out var typeHandler)) return typeHandler.Serialize(param);
49-
return string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.fff"), "'");
50-
}
47+
return AddslashesTypeHandler(typeof(DateTime), param) ?? string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.fff"), "'");
5148
else if (param is DateTime?)
52-
{
53-
if (Utils.TypeHandlers.TryGetValue(typeof(DateTime?), out var typeHandler)) return typeHandler.Serialize(param);
54-
return string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.fff"), "'");
55-
}
49+
return AddslashesTypeHandler(typeof(DateTime?), param) ?? string.Concat("'", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.fff"), "'");
5650

5751
else if (param is TimeSpan || param is TimeSpan?)
5852
return ((TimeSpan)param).Ticks / 10;
5953
else if (param is byte[])
6054
return $"0x{CommonUtils.BytesSqlRaw(param as byte[])}";
61-
else if (param is IEnumerable)
55+
else if (param is IEnumerable)
6256
return AddslashesIEnumerable(param, mapType, mapColumn);
6357

6458
return string.Concat("'", param.ToString().Replace("'", "''").Replace("\\", "\\\\"), "'");

Providers/FreeSql.Provider.Custom/Oracle/CustomOracleAdo/CustomOracleAdo.cs

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -53,20 +53,14 @@ public override object AddslashesProcessParam(object param, Type mapType, Column
5353
else if (param is char)
5454
return string.Concat("'", param.ToString().Replace("'", "''").Replace('\0', ' '), "'");
5555
else if (param is Enum)
56-
return ((Enum)param).ToInt64();
56+
return AddslashesTypeHandler(param.GetType(), param) ?? ((Enum)param).ToInt64();
5757
else if (decimal.TryParse(string.Concat(param), out var trydec))
5858
return param;
5959

6060
else if (param is DateTime)
61-
{
62-
if (Utils.TypeHandlers.TryGetValue(typeof(DateTime), out var typeHandler)) return typeHandler.Serialize(param);
63-
return string.Concat("to_timestamp('", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.ffffff"), "','YYYY-MM-DD HH24:MI:SS.FF6')");
64-
}
61+
return AddslashesTypeHandler(typeof(DateTime), param) ?? string.Concat("to_timestamp('", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.ffffff"), "','YYYY-MM-DD HH24:MI:SS.FF6')");
6562
else if (param is DateTime?)
66-
{
67-
if (Utils.TypeHandlers.TryGetValue(typeof(DateTime?), out var typeHandler)) return typeHandler.Serialize(param);
68-
return string.Concat("to_timestamp('", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.ffffff"), "','YYYY-MM-DD HH24:MI:SS.FF6')");
69-
}
63+
return AddslashesTypeHandler(typeof(DateTime?), param) ?? string.Concat("to_timestamp('", ((DateTime)param).ToString("yyyy-MM-dd HH:mm:ss.ffffff"), "','YYYY-MM-DD HH24:MI:SS.FF6')");
7064

7165
else if (param is TimeSpan || param is TimeSpan?)
7266
return $"numtodsinterval({((TimeSpan)param).Ticks * 1.0 / 10000000},'second')";

Providers/FreeSql.Provider.Custom/OracleAdapter.cs

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,9 +51,6 @@ public virtual string DateTimeRawSql(object value)
5151
{
5252
if (value == null) return "NULL";
5353
if (value.Equals(DateTime.MinValue) == true) value = new DateTime(1970, 1, 1);
54-
55-
if (value is DateTime && Utils.TypeHandlers.TryGetValue(typeof(DateTime), out var typeHandler)) return typeHandler.Serialize(value)?.ToString();
56-
if (value is DateTime? && Utils.TypeHandlers.TryGetValue(typeof(DateTime?), out var typeHandler2)) return typeHandler2.Serialize(value)?.ToString();
5754
return string.Concat("'", ((DateTime)value).ToString("yyyy-MM-dd HH:mm:ss"), "'");
5855
}
5956
public virtual string TimeSpanRawSql(object value) => value == null ? "NULL" : ((TimeSpan)value).TotalSeconds.ToString();

0 commit comments

Comments
 (0)