From cfd391c21a9819242953b6a554f13d46c005ecfd Mon Sep 17 00:00:00 2001 From: sunkaixuan <610262374@qq.com> Date: Wed, 20 Aug 2025 16:55:16 +0800 Subject: [PATCH] Update mongodb --- .../BinaryExpressionTranslator/Root.cs | 21 ++++++++++++++++++- .../SqlSugar.MongoDbCore/Tools/UtilMethods.cs | 13 ++++++++++++ 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/Src/Asp.NetCore2/SqlSugar.MongoDbCore/ExpToSql/VisitorItems/BinaryExpressionTranslator/Root.cs b/Src/Asp.NetCore2/SqlSugar.MongoDbCore/ExpToSql/VisitorItems/BinaryExpressionTranslator/Root.cs index 3b7cdeca4..5dc1af2d3 100644 --- a/Src/Asp.NetCore2/SqlSugar.MongoDbCore/ExpToSql/VisitorItems/BinaryExpressionTranslator/Root.cs +++ b/Src/Asp.NetCore2/SqlSugar.MongoDbCore/ExpToSql/VisitorItems/BinaryExpressionTranslator/Root.cs @@ -22,12 +22,31 @@ namespace SqlSugar.MongoDb public BsonDocument Extract(BinaryExpression expr) { - if (IsLogicalExpression(expr)) + if (IsValidJsonEqualityExpression(expr)) + return JsonEqualityExpression(expr); + else if (IsLogicalExpression(expr)) return LogicalBinaryExpression(expr); else return FieldComparisonOrCalculationExpression(expr); } + private BsonDocument JsonEqualityExpression(BinaryExpression expr) + { + var fieldName = new ExpressionVisitor(_context).Visit(expr.Left); + + // 步骤3:获取右侧常量值 + object rightValue = ExpressionTool.DynamicInvoke(expr.Right); + + var builder=InstanceFactory.GetInsertBuilder(this._context.context.CurrentConnectionConfig); + var json=builder.SerializeObjectFunc(rightValue); + return new BsonDocument(fieldName+"",UtilMethods.ParseJsonObject(json)); + } + + private bool IsValidJsonEqualityExpression(BinaryExpression expr) + { + return this._context?.context != null && expr.NodeType == ExpressionType.Equal && UtilMethods.IsJsonMember(expr.Left, this._context?.context) && ExpressionTool.GetParameters(expr.Right).Count == 0; + } + private static bool IsLogicalExpression(BinaryExpression expr) { return expr.NodeType == ExpressionType.AndAlso || expr.NodeType == ExpressionType.OrElse; diff --git a/Src/Asp.NetCore2/SqlSugar.MongoDbCore/Tools/UtilMethods.cs b/Src/Asp.NetCore2/SqlSugar.MongoDbCore/Tools/UtilMethods.cs index 1c065aafd..b8666c908 100644 --- a/Src/Asp.NetCore2/SqlSugar.MongoDbCore/Tools/UtilMethods.cs +++ b/Src/Asp.NetCore2/SqlSugar.MongoDbCore/Tools/UtilMethods.cs @@ -21,6 +21,19 @@ namespace SqlSugar.MongoDb { public class UtilMethods { + internal static bool IsJsonMember(Expression expression, SqlSugarProvider context) + { + var member = expression as MemberExpression; + if (member == null) + return false; + if (!(member.Type.IsClass())||member.Type==typeof(string)) + return false; + if (member.Expression == null) + return false; + var entity = context.EntityMaintenance.GetEntityInfo(member.Expression.Type); + var json = entity.Columns.FirstOrDefault(z => z.IsJson && z.PropertyName == member.Member.Name); + return json != null; + } internal static SugarParameter GetParameterConverter(int index, ISqlSugarClient db, object value, Expression oppoSiteExpression, EntityColumnInfo columnInfo) { var entity = db.EntityMaintenance.GetEntityInfo(oppoSiteExpression.Type);