mirror of
https://gitee.com/dotnetchina/SqlSugar.git
synced 2025-07-16 16:50:41 +08:00
Update mongodb
This commit is contained in:
parent
02c8723f8d
commit
9c8760ca06
@ -1,4 +1,5 @@
|
|||||||
using System;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
using System.Linq;
|
using System.Linq;
|
||||||
using System.Text.RegularExpressions;
|
using System.Text.RegularExpressions;
|
||||||
|
|
||||||
@ -123,5 +124,142 @@ namespace SqlSugar.MongoDb
|
|||||||
}
|
}
|
||||||
return null;
|
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