Skip to content

Commit 2a5b569

Browse files
committed
- 修复 MySql JsonMap Enum 统一解析为 int;#2040
1 parent e949209 commit 2a5b569

File tree

5 files changed

+213
-74
lines changed

5 files changed

+213
-74
lines changed

Extensions/FreeSql.Extensions.JsonMap/JsonMapCore.cs

Lines changed: 100 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using FreeSql;
22
using FreeSql.DataAnnotations;
3+
using FreeSql.Internal.CommonProvider;
34
using Newtonsoft.Json;
45
using System;
56
using System.Collections.Concurrent;
@@ -121,10 +122,97 @@ public static void UseJsonMap(this IFreeSql fsql, JsonSerializerSettings setting
121122
// }
122123
// }
123124
//}
125+
//处理 mysql enum -> int
126+
switch (fsql.Ado.DataType)
127+
{
128+
case DataType.MySql:
129+
case DataType.OdbcMySql:
130+
case DataType.CustomMySql:
131+
if (e.Expression.NodeType == ExpressionType.Equal &&
132+
e.Expression is BinaryExpression binaryExpression)
133+
{
134+
var comonExp = (fsql.Select<object>() as Select0Provider)._commonExpression;
135+
var leftExp = binaryExpression.Left;
136+
var rightExp = binaryExpression.Right;
137+
if (
138+
leftExp.NodeType == ExpressionType.Convert &&
139+
leftExp is UnaryExpression leftExpUexp &&
140+
leftExpUexp.Operand?.Type.NullableTypeOrThis().IsEnum == true &&
141+
142+
rightExp.NodeType == ExpressionType.Convert &&
143+
rightExp is UnaryExpression rightExpUexp &&
144+
rightExpUexp.Operand?.Type.NullableTypeOrThis().IsEnum == true)
145+
{
146+
string leftSql = null, rightSql = null;
147+
if (leftExpUexp.Operand.NodeType == ExpressionType.MemberAccess &&
148+
LocalParseMemberExp(leftExpUexp.Operand as MemberExpression))
149+
leftSql = e.Result;
150+
151+
if (rightExpUexp.Operand.NodeType == ExpressionType.MemberAccess &&
152+
LocalParseMemberExp(rightExpUexp.Operand as MemberExpression))
153+
rightSql = e.Result;
154+
155+
if (!string.IsNullOrEmpty(leftSql) && string.IsNullOrEmpty(rightSql) && !rightExpUexp.Operand.IsParameter())
156+
rightSql = comonExp.formatSql(Expression.Lambda(rightExpUexp.Operand).Compile().DynamicInvoke(), typeof(int), null, null);
157+
if (string.IsNullOrEmpty(leftSql) && !string.IsNullOrEmpty(rightSql) && !leftExpUexp.Operand.IsParameter())
158+
leftSql = comonExp.formatSql(Expression.Lambda(leftExpUexp.Operand).Compile().DynamicInvoke(), typeof(int), null, null);
159+
160+
if (!string.IsNullOrEmpty(leftSql) && !string.IsNullOrEmpty(rightSql))
161+
{
162+
e.Result = $"{leftSql} = {rightSql}";
163+
return;
164+
}
165+
e.Result = null;
166+
return;
167+
}
168+
}
169+
if (e.Expression.NodeType == ExpressionType.Call &&
170+
e.Expression is MethodCallExpression callExp &&
171+
callExp.Method.Name == "Contains")
172+
{
173+
var objExp = callExp.Object;
174+
var objType = objExp?.Type;
175+
if (objType?.FullName == "System.Byte[]") return;
176+
177+
var argIndex = 0;
178+
if (objType == null && callExp.Method.DeclaringType == typeof(Enumerable))
179+
{
180+
objExp = callExp.Arguments.FirstOrDefault();
181+
objType = objExp?.Type;
182+
argIndex++;
183+
184+
if (objType == typeof(string)) return;
185+
}
186+
if (objType == null) objType = callExp.Method.DeclaringType;
187+
if (objType != null || objType.IsArrayOrList())
188+
{
189+
var memExp = callExp.Arguments[argIndex];
190+
if (memExp.NodeType == ExpressionType.MemberAccess &&
191+
memExp.Type.NullableTypeOrThis().IsEnum &&
192+
LocalParseMemberExp(memExp as MemberExpression))
193+
{
194+
if (!objExp.IsParameter())
195+
{
196+
var comonExp = (fsql.Select<object>() as Select0Provider)._commonExpression;
197+
var rightSql = comonExp.formatSql(Expression.Lambda(objExp).Compile().DynamicInvoke(), typeof(int), null, null);
198+
e.Result = $"{e.Result} in {rightSql.Replace(", \r\n \r\n", $") \r\n OR {e.Result} in (")}";
199+
return;
200+
}
201+
e.Result = null;
202+
return;
203+
}
204+
}
205+
}
206+
break;
207+
}
124208
//解析 POCO Json a.Customer.Name
125-
if (e.Expression is MemberExpression memExp)
209+
if (e.Expression.NodeType == ExpressionType.MemberAccess)
210+
LocalParseMemberExp(e.Expression as MemberExpression);
211+
212+
bool LocalParseMemberExp(MemberExpression memExp)
126213
{
127-
if (e.Expression.IsParameter() == false) return;
214+
if (memExp == null) return false;
215+
if (e.Expression.IsParameter() == false) return false;
128216
var parentMemExps = new Stack<MemberExpression>();
129217
parentMemExps.Push(memExp);
130218
while (true)
@@ -133,25 +221,25 @@ public static void UseJsonMap(this IFreeSql fsql, JsonSerializerSettings setting
133221
{
134222
case ExpressionType.MemberAccess:
135223
case ExpressionType.Parameter: break;
136-
default: return;
224+
default: return false;
137225
}
138226
switch (memExp.Expression.NodeType)
139227
{
140228
case ExpressionType.MemberAccess:
141229
memExp = memExp.Expression as MemberExpression;
142-
if (memExp == null) return;
230+
if (memExp == null) return false;
143231
parentMemExps.Push(memExp);
144232
break;
145233
case ExpressionType.Parameter:
146234
var tb = fsql.CodeFirst.GetTableByEntity(memExp.Expression.Type);
147-
if (tb == null) return;
148-
if (tb.ColumnsByCs.TryGetValue(parentMemExps.Pop().Member.Name, out var trycol) == false) return;
149-
if (_dicTypes.ContainsKey(trycol.CsType) == false) return;
235+
if (tb == null) return false;
236+
if (tb.ColumnsByCs.TryGetValue(parentMemExps.Pop().Member.Name, out var trycol) == false) return false;
237+
if (_dicTypes.ContainsKey(trycol.CsType) == false) return false;
150238
var result = e.FreeParse(Expression.MakeMemberAccess(memExp.Expression, tb.Properties[trycol.CsName]));
151239
if (parentMemExps.Any() == false)
152240
{
153241
e.Result = result;
154-
return;
242+
return true;
155243
}
156244
var jsonPath = "";
157245
switch (fsql.Ado.DataType)
@@ -161,7 +249,7 @@ public static void UseJsonMap(this IFreeSql fsql, JsonSerializerSettings setting
161249
case DataType.OdbcMySql:
162250
case DataType.CustomMySql:
163251
StyleJsonExtract();
164-
return;
252+
return true;
165253
case DataType.SqlServer:
166254
case DataType.OdbcSqlServer:
167255
case DataType.CustomSqlServer:
@@ -170,13 +258,13 @@ public static void UseJsonMap(this IFreeSql fsql, JsonSerializerSettings setting
170258
case DataType.CustomOracle:
171259
case DataType.Dameng:
172260
StyleJsonValue();
173-
return;
261+
return true;
174262
case DataType.DuckDB:
175263
StyleDotAccess();
176-
return;
264+
return true;
177265
}
178266
StylePgJson();
179-
return;
267+
return true;
180268

181269
void StyleJsonExtract()
182270
{

FreeSql-lite.sln

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -93,12 +93,12 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FreeSql.Extensions.ZeroEnti
9393
EndProject
9494
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FreeSql.Provider.Duckdb", "Providers\FreeSql.Provider.Duckdb\FreeSql.Provider.Duckdb.csproj", "{02CFB50A-D8C4-470D-AC93-5540D6029430}"
9595
EndProject
96-
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FreeSql.Tests.Provider.Duckdb", "FreeSql.Tests\FreeSql.Tests.Provider.Duckdb\FreeSql.Tests.Provider.Duckdb.csproj", "{B9787A81-D537-45ED-B413-61BF03C8FEBE}"
97-
EndProject
9896
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FreeSql.Provider.TDengine", "Providers\FreeSql.Provider.TDengine\FreeSql.Provider.TDengine.csproj", "{C89AFB35-AC56-4683-BCB5-13D3522DFED3}"
9997
EndProject
10098
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "FreeSql.Extensions.EFModel", "Extensions\FreeSql.Extensions.EFModel\FreeSql.Extensions.EFModel.csproj", "{0BFF3BB8-02ED-460A-A5C8-D9D047791AB0}"
10199
EndProject
100+
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "FreeSql.Tests.Provider.MySqlConnector", "FreeSql.Tests\FreeSql.Tests.Provider.MySqlConnector\FreeSql.Tests.Provider.MySqlConnector.csproj", "{B20EFBC2-CB6A-CD59-32C2-9F2C865CE4A3}"
101+
EndProject
102102
Global
103103
GlobalSection(SolutionConfigurationPlatforms) = preSolution
104104
Debug|Any CPU = Debug|Any CPU
@@ -529,18 +529,6 @@ Global
529529
{02CFB50A-D8C4-470D-AC93-5540D6029430}.Release|x64.Build.0 = Release|Any CPU
530530
{02CFB50A-D8C4-470D-AC93-5540D6029430}.Release|x86.ActiveCfg = Release|Any CPU
531531
{02CFB50A-D8C4-470D-AC93-5540D6029430}.Release|x86.Build.0 = Release|Any CPU
532-
{B9787A81-D537-45ED-B413-61BF03C8FEBE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
533-
{B9787A81-D537-45ED-B413-61BF03C8FEBE}.Debug|Any CPU.Build.0 = Debug|Any CPU
534-
{B9787A81-D537-45ED-B413-61BF03C8FEBE}.Debug|x64.ActiveCfg = Debug|Any CPU
535-
{B9787A81-D537-45ED-B413-61BF03C8FEBE}.Debug|x64.Build.0 = Debug|Any CPU
536-
{B9787A81-D537-45ED-B413-61BF03C8FEBE}.Debug|x86.ActiveCfg = Debug|Any CPU
537-
{B9787A81-D537-45ED-B413-61BF03C8FEBE}.Debug|x86.Build.0 = Debug|Any CPU
538-
{B9787A81-D537-45ED-B413-61BF03C8FEBE}.Release|Any CPU.ActiveCfg = Release|Any CPU
539-
{B9787A81-D537-45ED-B413-61BF03C8FEBE}.Release|Any CPU.Build.0 = Release|Any CPU
540-
{B9787A81-D537-45ED-B413-61BF03C8FEBE}.Release|x64.ActiveCfg = Release|Any CPU
541-
{B9787A81-D537-45ED-B413-61BF03C8FEBE}.Release|x64.Build.0 = Release|Any CPU
542-
{B9787A81-D537-45ED-B413-61BF03C8FEBE}.Release|x86.ActiveCfg = Release|Any CPU
543-
{B9787A81-D537-45ED-B413-61BF03C8FEBE}.Release|x86.Build.0 = Release|Any CPU
544532
{C89AFB35-AC56-4683-BCB5-13D3522DFED3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
545533
{C89AFB35-AC56-4683-BCB5-13D3522DFED3}.Debug|Any CPU.Build.0 = Debug|Any CPU
546534
{C89AFB35-AC56-4683-BCB5-13D3522DFED3}.Debug|x64.ActiveCfg = Debug|Any CPU
@@ -565,6 +553,18 @@ Global
565553
{0BFF3BB8-02ED-460A-A5C8-D9D047791AB0}.Release|x64.Build.0 = Release|Any CPU
566554
{0BFF3BB8-02ED-460A-A5C8-D9D047791AB0}.Release|x86.ActiveCfg = Release|Any CPU
567555
{0BFF3BB8-02ED-460A-A5C8-D9D047791AB0}.Release|x86.Build.0 = Release|Any CPU
556+
{B20EFBC2-CB6A-CD59-32C2-9F2C865CE4A3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
557+
{B20EFBC2-CB6A-CD59-32C2-9F2C865CE4A3}.Debug|Any CPU.Build.0 = Debug|Any CPU
558+
{B20EFBC2-CB6A-CD59-32C2-9F2C865CE4A3}.Debug|x64.ActiveCfg = Debug|Any CPU
559+
{B20EFBC2-CB6A-CD59-32C2-9F2C865CE4A3}.Debug|x64.Build.0 = Debug|Any CPU
560+
{B20EFBC2-CB6A-CD59-32C2-9F2C865CE4A3}.Debug|x86.ActiveCfg = Debug|Any CPU
561+
{B20EFBC2-CB6A-CD59-32C2-9F2C865CE4A3}.Debug|x86.Build.0 = Debug|Any CPU
562+
{B20EFBC2-CB6A-CD59-32C2-9F2C865CE4A3}.Release|Any CPU.ActiveCfg = Release|Any CPU
563+
{B20EFBC2-CB6A-CD59-32C2-9F2C865CE4A3}.Release|Any CPU.Build.0 = Release|Any CPU
564+
{B20EFBC2-CB6A-CD59-32C2-9F2C865CE4A3}.Release|x64.ActiveCfg = Release|Any CPU
565+
{B20EFBC2-CB6A-CD59-32C2-9F2C865CE4A3}.Release|x64.Build.0 = Release|Any CPU
566+
{B20EFBC2-CB6A-CD59-32C2-9F2C865CE4A3}.Release|x86.ActiveCfg = Release|Any CPU
567+
{B20EFBC2-CB6A-CD59-32C2-9F2C865CE4A3}.Release|x86.Build.0 = Release|Any CPU
568568
EndGlobalSection
569569
GlobalSection(SolutionProperties) = preSolution
570570
HideSolutionNode = FALSE
@@ -605,8 +605,8 @@ Global
605605
{0BFF3BB8-02ED-460A-A5C8-D9D047791AB0} = {4A92E8A6-9A6D-41A1-9CDA-DE10899648AA}
606606
EndGlobalSection
607607
GlobalSection(ExtensibilityGlobals) = postSolution
608-
SolutionGuid = {089687FA-5D21-40AC-BA8A-AA0D1E1H7F98}
609-
RESX_PrefixTranslations = True
610608
RESX_NeutralResourcesLanguage = en-US
609+
RESX_PrefixTranslations = True
610+
SolutionGuid = {089687FA-5D21-40AC-BA8A-AA0D1E1H7F98}
611611
EndGlobalSection
612612
EndGlobal

FreeSql.DbContext/FreeSql.DbContext.xml

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

FreeSql.Tests/FreeSql.Tests.Provider.MySqlConnector/FreeSql.Tests.Provider.MySqlConnector.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
</ItemGroup>
2121

2222
<ItemGroup>
23+
<ProjectReference Include="..\..\Extensions\FreeSql.Extensions.JsonMap\FreeSql.Extensions.JsonMap.csproj" />
2324
<ProjectReference Include="..\..\Extensions\FreeSql.Extensions.LazyLoading\FreeSql.Extensions.LazyLoading.csproj" />
2425
<ProjectReference Include="..\..\FreeSql.DbContext\FreeSql.DbContext.csproj" />
2526
<ProjectReference Include="..\..\FreeSql\FreeSql.csproj" />

0 commit comments

Comments
 (0)