11using FreeSql ;
22using FreeSql . DataAnnotations ;
3+ using FreeSql . Internal . CommonProvider ;
34using Newtonsoft . Json ;
45using System ;
56using 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 {
0 commit comments