diff --git a/Src/Asp.NetCore2/MongoDbTest/UnitTest/QuerySelect.cs b/Src/Asp.NetCore2/MongoDbTest/UnitTest/QuerySelect.cs index 77ac8c6d4..a1be45340 100644 --- a/Src/Asp.NetCore2/MongoDbTest/UnitTest/QuerySelect.cs +++ b/Src/Asp.NetCore2/MongoDbTest/UnitTest/QuerySelect.cs @@ -37,6 +37,11 @@ namespace MongoDbTest if (list.First().hour != dt.Hour) Cases.ThrowUnitError(); if (list.First().Minute != dt.Minute) Cases.ThrowUnitError(); if (list.First().Second != dt.Second) Cases.ThrowUnitError(); + var list2 = db.Queryable().Select(it => new + { + date = it.CreateDateTime.ToString("yyyy-MM-dd") + }).ToList(); + if(list2.First().date!=dt.ToString("yyyy-MM-dd")) Cases.ThrowUnitError(); } [SqlSugar.SugarTable("UnitStudent1231sds3z1")] public class Student : MongoDbBase diff --git a/Src/Asp.NetCore2/SqlSugar.MongoDbCore/ExpToSql/VisitorItems/MethodCallExpressionTractor.cs b/Src/Asp.NetCore2/SqlSugar.MongoDbCore/ExpToSql/VisitorItems/MethodCallExpressionTractor.cs index 85163d17c..bdecd89f1 100644 --- a/Src/Asp.NetCore2/SqlSugar.MongoDbCore/ExpToSql/VisitorItems/MethodCallExpressionTractor.cs +++ b/Src/Asp.NetCore2/SqlSugar.MongoDbCore/ExpToSql/VisitorItems/MethodCallExpressionTractor.cs @@ -36,9 +36,17 @@ namespace SqlSugar.MongoDb foreach (var item in args) { model.Args.Add(new MethodCallExpressionArgs() { MemberValue = item }); - } - var funcString= context.GetType().GetMethod(name).Invoke(context, new object[] { model }); - result = UtilMethods.MyCreate(funcString); + } + if (name == nameof(ToString)) + { + var funcString = context.ToString(model); + result = BsonDocument.Parse(funcString); + } + else + { + var funcString = context.GetType().GetMethod(name).Invoke(context, new object[] { model }); + result = UtilMethods.MyCreate(funcString); + } } return result; } diff --git a/Src/Asp.NetCore2/SqlSugar.MongoDbCore/MongoDb/SqlBuilder/MongoDbExpressionContext.cs b/Src/Asp.NetCore2/SqlSugar.MongoDbCore/MongoDb/SqlBuilder/MongoDbExpressionContext.cs index 3dcfc36fd..1da86e449 100644 --- a/Src/Asp.NetCore2/SqlSugar.MongoDbCore/MongoDb/SqlBuilder/MongoDbExpressionContext.cs +++ b/Src/Asp.NetCore2/SqlSugar.MongoDbCore/MongoDb/SqlBuilder/MongoDbExpressionContext.cs @@ -5,6 +5,7 @@ using System; using System.Linq; using System.Linq.Expressions; using System.Text.RegularExpressions; +using Microsoft.IdentityModel.Tokens; namespace SqlSugar.MongoDb { public class MongoDbExpressionContext : ExpressionContext, ILambdaExpressions @@ -347,6 +348,80 @@ namespace SqlSugar.MongoDb return expr.ToJson(UtilMethods.GetJsonWriterSettings()); } return null; + } + public override string ToString(MethodCallExpressionModel model) + { + var item = model.DataObject as Expression; + BsonValue memberName = new ExpressionVisitor(context).Visit(item as Expression); + + if (model.Args == null || model.Args.Count == 0) + { + // 只有 ToString(),直接转字符串 + var toStringDoc = new BsonDocument("$toString", $"${memberName}"); + return toStringDoc.ToJson(UtilMethods.GetJsonWriterSettings()); + } + else if (model.Args.Count == 1) + { + var format = (model.Args.First().MemberValue).ObjToString().TrimStart('"').TrimEnd('"'); + // 先判断类型 + var type = (item as MemberExpression)?.Type ?? (item as UnaryExpression)?.Type; + if (type == typeof(DateTime) || type == typeof(DateTime?)) + { + // C#格式转MongoDB格式 + string mongoFormat = ConvertCSharpDateFormatToMongo(format); + var dateToStringDoc = new BsonDocument("$dateToString", new BsonDocument + { + { "format", mongoFormat }, + { "date", $"${memberName}" } + }); + return dateToStringDoc.ToJson(UtilMethods.GetJsonWriterSettings()); + } + else if (UtilConstants.NumericalTypes.Contains(type)) + { + // 数字格式化,MongoDB不支持C#的数字格式,需要先转字符串再在C#端格式化 + // 这里只能简单转字符串 + var toStringDoc = new BsonDocument("$toString", $"${memberName}"); + return toStringDoc.ToJson(UtilMethods.GetJsonWriterSettings()); + } + else + { + // 其他类型直接转字符串 + var toStringDoc = new BsonDocument("$toString", $"${memberName}"); + return toStringDoc.ToJson(UtilMethods.GetJsonWriterSettings()); + } + } + else + { + throw new NotSupportedException("ToString 只支持0或1个参数"); + } } + + #region + + // Existing methods... + + /// + /// Converts a C# date format string to a MongoDB-compatible date format string. + /// + /// The C# date format string. + /// The MongoDB-compatible date format string. + public string ConvertCSharpDateFormatToMongo(string csharpFormat) + { + if (string.IsNullOrEmpty(csharpFormat)) + { + throw new ArgumentNullException(nameof(csharpFormat), "Date format cannot be null or empty."); + } + + // Replace C# date format specifiers with MongoDB equivalents + return csharpFormat + .Replace("yyyy", "%Y") + .Replace("MM", "%m") + .Replace("dd", "%d") + .Replace("HH", "%H") + .Replace("mm", "%M") + .Replace("ss", "%S") + .Replace("fff", "%L"); // Milliseconds + } + #endregion } }