mirror of
https://gitee.com/dotnetchina/SqlSugar.git
synced 2025-07-15 14:04:44 +08:00
Update mongodb
This commit is contained in:
parent
02c8723f8d
commit
9c8760ca06
@ -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<string, SugarParameter[]> ConditionalModelToSql(List<IConditionalModel> models, int beginIndex = 0)
|
||||
{
|
||||
// MongoDB的查询条件通常以JSON格式表达,不需要参数化
|
||||
if (models == null || models.Count == 0)
|
||||
return new KeyValuePair<string, SugarParameter[]>("{}", Array.Empty<SugarParameter>());
|
||||
|
||||
if (models.Count == 1 && models.First() is ConditionalCollections collections)
|
||||
{
|
||||
return ConditionalModelToSqlByConditionalCollections(collections);
|
||||
}
|
||||
|
||||
var filterParts = new List<string>();
|
||||
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<string, SugarParameter[]>(filter, Array.Empty<SugarParameter>());
|
||||
|
||||
// 辅助方法:将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<object> arr) return ToMongoArray(arr);
|
||||
if (value is IEnumerable<string> 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<string>();
|
||||
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<string, SugarParameter[]> ConditionalModelToSqlByConditionalCollections(ConditionalCollections collections)
|
||||
{
|
||||
// collections.ConditionalList: List<KeyValuePair<string, List<IConditionalModel>>>,每个子List是一个分组,Key为分组的WhereType
|
||||
var groupFilters = new List<string>();
|
||||
var allParameters = new List<SugarParameter>();
|
||||
int paramIndex = 0;
|
||||
|
||||
foreach (var group in collections.ConditionalList)
|
||||
{
|
||||
var result = this.ConditionalModelToSql(new List<IConditionalModel>() { 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<string, SugarParameter[]>(finalFilter, allParameters.ToArray());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user