diff --git a/Src/Asp.NetCore2/SqlSugar.MongoDbCore/MongoDb/SqlBuilder/MongoDbBuilder.cs b/Src/Asp.NetCore2/SqlSugar.MongoDbCore/MongoDb/SqlBuilder/MongoDbBuilder.cs index f786494a9..5ed22d3e7 100644 --- a/Src/Asp.NetCore2/SqlSugar.MongoDbCore/MongoDb/SqlBuilder/MongoDbBuilder.cs +++ b/Src/Asp.NetCore2/SqlSugar.MongoDbCore/MongoDb/SqlBuilder/MongoDbBuilder.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Linq; using System.Text.RegularExpressions; @@ -123,5 +124,142 @@ namespace SqlSugar.MongoDb } return null; } + + public override KeyValuePair ConditionalModelToSql(List models, int beginIndex = 0) + { + // MongoDB的查询条件通常以JSON格式表达,不需要参数化 + if (models == null || models.Count == 0) + return new KeyValuePair("{}", Array.Empty()); + + if (models.Count == 1 && models.First() is ConditionalCollections collections) + { + return ConditionalModelToSqlByConditionalCollections(collections); + } + + var filterParts = new List(); + foreach (var model in models) + { + if (model is ConditionalModel cond) + { + string field = cond.FieldName; + string op = cond.ConditionalType + ""; + string fieldValue = cond.FieldValue; + object value= SqlSugar.UtilMethods.ConvertDataByTypeName(cond.CSharpTypeName, fieldValue); + switch (op) + { + case "Equal": + filterParts.Add($"\"{field}\": {ToMongoValue(value)}"); + break; + case "NotEqual": + filterParts.Add($"\"{field}\": {{ \"$ne\": {ToMongoValue(value)} }}"); + break; + case "GreaterThan": + filterParts.Add($"\"{field}\": {{ \"$gt\": {ToMongoValue(value)} }}"); + break; + case "GreaterThanOrEqual": + filterParts.Add($"\"{field}\": {{ \"$gte\": {ToMongoValue(value)} }}"); + break; + case "LessThan": + filterParts.Add($"\"{field}\": {{ \"$lt\": {ToMongoValue(value)} }}"); + break; + case "LessThanOrEqual": + filterParts.Add($"\"{field}\": {{ \"$lte\": {ToMongoValue(value)} }}"); + break; + case "In": + filterParts.Add($"\"{field}\": {{ \"$in\": {ToMongoArray(value)} }}"); + break; + case "Like": + // MongoDB的模糊查询用正则表达式 + filterParts.Add($"\"{field}\": {{ \"$regex\": {ToMongoRegex(value)}, \"$options\": \"i\" }}"); + break; + case "IsNull": + filterParts.Add($"\"{field}\": null"); + break; + case "IsNotNull": + filterParts.Add($"\"{field}\": {{ \"$ne\": null }}"); + break; + default: + // 其他操作符可扩展 + break; + } + } + // 其他类型的IConditionalModel可扩展 + } + + string filter = "{ " + string.Join(", ", filterParts) + " }"; + return new KeyValuePair(filter, Array.Empty()); + + // 辅助方法:将C#对象转换为MongoDB JSON值 + static string ToMongoValue(object value) + { + if (value == null) return "null"; + if (value is string s) return $"\"{EscapeString(s)}\""; + if (value is bool b) return b ? "true" : "false"; + if (value is DateTime dt) return $"{{ \"$date\": \"{dt:O}\" }}"; + if (value is Enum) return Convert.ToInt32(value).ToString(); + if (value is IEnumerable arr) return ToMongoArray(arr); + if (value is IEnumerable arrStr) return ToMongoArray(arrStr); + return value.ToString(); + } + + static string ToMongoArray(object value) + { + if (value is System.Collections.IEnumerable enumerable && !(value is string)) + { + var items = new List(); + foreach (var item in enumerable) + { + items.Add(ToMongoValue(item)); + } + return "[ " + string.Join(", ", items) + " ]"; + } + return "[ " + ToMongoValue(value) + " ]"; + } + + static string ToMongoRegex(object value) + { + if (value == null) return "\"\""; + return $"\"{EscapeString(value.ToString())}\""; + } + + static string EscapeString(string s) + { + return s.Replace("\\", "\\\\").Replace("\"", "\\\""); + } + } + + private KeyValuePair ConditionalModelToSqlByConditionalCollections(ConditionalCollections collections) + { + // collections.ConditionalList: List>>,每个子List是一个分组,Key为分组的WhereType + var groupFilters = new List(); + var allParameters = new List(); + int paramIndex = 0; + + foreach (var group in collections.ConditionalList) + { + var result = this.ConditionalModelToSql(new List() { group.Value }, paramIndex); + string filter = result.Key; + SugarParameter[] parameters = result.Value; + + if (!string.IsNullOrWhiteSpace(filter) && filter != "{}") + { + string innerFilter = filter.Trim(); + if (innerFilter.StartsWith("{") && innerFilter.EndsWith("}")) + { + innerFilter = innerFilter.Substring(1, innerFilter.Length - 2).Trim(); + } + if (!string.IsNullOrEmpty(innerFilter)) + { + string groupOperator = group.Key == WhereType.Or ? "$or" : "$and"; + groupFilters.Add($"\"{groupOperator}\": [ {{ {innerFilter} }} ]"); + allParameters.AddRange(parameters); + paramIndex += parameters.Length; + } + } + } + var finalFilter + = "[ " + string.Join(", ", groupFilters.Select(f => "{ " + f + " }")) + " ] "; + return new KeyValuePair(finalFilter, allParameters.ToArray()); + } } }