From 6ac476344f52078232b92abaff1389e7510fd540 Mon Sep 17 00:00:00 2001 From: sunkaixuan <610262374@qq.com> Date: Mon, 30 Jun 2025 10:57:16 +0800 Subject: [PATCH] Update mongodb --- .../MongoDbTest/UnitTest/QueryLeftJoin2.cs | 15 ++++++++---- .../SqlFuncExpression.cs | 24 +++++++++---------- .../SqlBuilder/MongoDbExpressionContext.cs | 7 +----- .../SqlSugar.MongoDbCore/Tools/UtilMethods.cs | 17 +++++++++++++ 4 files changed, 41 insertions(+), 22 deletions(-) diff --git a/Src/Asp.NetCore2/MongoDbTest/UnitTest/QueryLeftJoin2.cs b/Src/Asp.NetCore2/MongoDbTest/UnitTest/QueryLeftJoin2.cs index 446b17902..4328b6d28 100644 --- a/Src/Asp.NetCore2/MongoDbTest/UnitTest/QueryLeftJoin2.cs +++ b/Src/Asp.NetCore2/MongoDbTest/UnitTest/QueryLeftJoin2.cs @@ -66,11 +66,18 @@ namespace MongoDbTest schoolName = sc.Name }).ToList(); if (dt5.First().studentName != "张三"&& dt5.First().schoolName!= "清华大学") Cases.ThrowUnitError(); + var allList = db.Queryable().Where(s => s.Name == s.Name.ToString()) .ToList(); + if(allList.Count!=2) Cases.ThrowUnitError(); + var allList2 = db.Queryable().Where(s => s.Name.ToString() == s.Name).ToList(); + if (allList2.Count != 2) Cases.ThrowUnitError(); + var allList3 = db.Queryable().Where(s => s.Name.ToString() == s.Name.ToString()).ToList(); + if (allList3.Count != 2) Cases.ThrowUnitError(); //var dt4 = db.Queryable() - //.LeftJoin((s, sc) => s.SchoolId.ToLower() == sc.Id) - //.Select((s,sc)=>new { - // studentName=s.Name, - // schoolName=sc.Name + //.LeftJoin((s, sc) => s.SchoolId.ToString() == sc.Id.ToString()) + //.Select((s, sc) => new + //{ + // studentName = s.Name, + // schoolName = sc.Name //}).ToList(); //if (dt3.First().Name != "张三") Cases.ThrowUnitError(); } diff --git a/Src/Asp.NetCore2/SqlSugar.MongoDbCore/ExpToSql/VisitorItems/BinaryExpressionTranslator/SqlFuncExpression.cs b/Src/Asp.NetCore2/SqlSugar.MongoDbCore/ExpToSql/VisitorItems/BinaryExpressionTranslator/SqlFuncExpression.cs index 16c46922b..3d8b62a40 100644 --- a/Src/Asp.NetCore2/SqlSugar.MongoDbCore/ExpToSql/VisitorItems/BinaryExpressionTranslator/SqlFuncExpression.cs +++ b/Src/Asp.NetCore2/SqlSugar.MongoDbCore/ExpToSql/VisitorItems/BinaryExpressionTranslator/SqlFuncExpression.cs @@ -13,6 +13,10 @@ namespace SqlSugar.MongoDb var mongoDbType = BinaryExpressionTranslator.GetComparisonType(expressionInfo.NodeType); var left = new ExpressionVisitor(_context).Visit(expressionInfo.LeftExp); var right = new ExpressionVisitor(_context).Visit(expressionInfo.RightExp); + if (leftIsMember && !UtilMethods.IsMongoVariable(left)) + left = UtilMethods.GetMemberName(left); + if (rightIsMember && !UtilMethods.IsMongoVariable(right)) + right = UtilMethods.GetMemberName(right); var filter = new BsonDocument("$expr", new BsonDocument(mongoDbType, new BsonArray { left, @@ -23,18 +27,14 @@ namespace SqlSugar.MongoDb private SqlFuncBinaryExpressionInfo GetSqlFuncBinaryExpressionInfo(bool leftIsMember, bool rightIsMember, BinaryExpression expr) { SqlFuncBinaryExpressionInfo sqlFuncBinaryExpressionInfo = new SqlFuncBinaryExpressionInfo(); - sqlFuncBinaryExpressionInfo.LeftMethodName= GetSystemDateMemberName(MongoDbExpTools.RemoveConvert(expr.Left)); - if (!string.IsNullOrEmpty(sqlFuncBinaryExpressionInfo.LeftMethodName)) - { - sqlFuncBinaryExpressionInfo.LeftIsFunc = true; - } - sqlFuncBinaryExpressionInfo.RightMethodName = GetSystemDateMemberName(MongoDbExpTools.RemoveConvert(expr.Right)); - if (!string.IsNullOrEmpty(sqlFuncBinaryExpressionInfo.RightMethodName)) - { - sqlFuncBinaryExpressionInfo.RightIsFunc = true; - } - sqlFuncBinaryExpressionInfo.LeftExp = MongoDbExpTools.RemoveConvert(expr.Left); - sqlFuncBinaryExpressionInfo.RightExp = MongoDbExpTools.RemoveConvert(expr.Right); + var left = MongoDbExpTools.RemoveConvert(expr.Left); + var right = MongoDbExpTools.RemoveConvert(expr.Right); + sqlFuncBinaryExpressionInfo.LeftMethodName= GetSystemDateMemberName(left); + sqlFuncBinaryExpressionInfo.LeftIsFunc =!leftIsMember&& left is MethodCallExpression &&ExpressionTool.GetParameters(left).Count>0; + sqlFuncBinaryExpressionInfo.RightMethodName = GetSystemDateMemberName(right); + sqlFuncBinaryExpressionInfo.RightIsFunc = !rightIsMember && right is MethodCallExpression && ExpressionTool.GetParameters(right).Count > 0; + sqlFuncBinaryExpressionInfo.LeftExp = MongoDbExpTools.RemoveConvert(left); + sqlFuncBinaryExpressionInfo.RightExp = MongoDbExpTools.RemoveConvert(right); sqlFuncBinaryExpressionInfo.NodeType= expr.NodeType; return sqlFuncBinaryExpressionInfo; } diff --git a/Src/Asp.NetCore2/SqlSugar.MongoDbCore/MongoDb/SqlBuilder/MongoDbExpressionContext.cs b/Src/Asp.NetCore2/SqlSugar.MongoDbCore/MongoDb/SqlBuilder/MongoDbExpressionContext.cs index 5c800b24f..0a6d35ebc 100644 --- a/Src/Asp.NetCore2/SqlSugar.MongoDbCore/MongoDb/SqlBuilder/MongoDbExpressionContext.cs +++ b/Src/Asp.NetCore2/SqlSugar.MongoDbCore/MongoDb/SqlBuilder/MongoDbExpressionContext.cs @@ -635,12 +635,7 @@ namespace SqlSugar.MongoDb #region Helper private static BsonValue GetMemberName(BsonValue memberName) { - if (memberName is BsonDocument) - return memberName; - if (memberName is BsonArray) - return memberName; - else - return $"${memberName}"; + return UtilMethods.GetMemberName(memberName); } /// diff --git a/Src/Asp.NetCore2/SqlSugar.MongoDbCore/Tools/UtilMethods.cs b/Src/Asp.NetCore2/SqlSugar.MongoDbCore/Tools/UtilMethods.cs index ca0306749..c4c4d79df 100644 --- a/Src/Asp.NetCore2/SqlSugar.MongoDbCore/Tools/UtilMethods.cs +++ b/Src/Asp.NetCore2/SqlSugar.MongoDbCore/Tools/UtilMethods.cs @@ -1,4 +1,5 @@ using Dm.util; +using Microsoft.IdentityModel.Tokens; using MongoDB.Bson; using MongoDB.Bson.Serialization; using System; @@ -582,6 +583,22 @@ namespace SqlSugar.MongoDb { return col.DbColumnName == "_id" || col.DataType == nameof(ObjectId); } + + internal static bool IsMongoVariable(BsonValue memberName) + { + return memberName is BsonString s && s.Value?.StartsWith("$")==true; + } + internal static BsonValue GetMemberName(BsonValue memberName) + { + if (memberName is BsonDocument) + return memberName; + if (memberName is BsonArray) + return memberName; + else if (UtilMethods.IsMongoVariable(memberName)) + return memberName; + else + return $"${memberName}"; + } //public static object ConvertDataByTypeName(string ctypename,string value) //{ // var item = new ConditionalModel() {