Update mongodb

This commit is contained in:
sunkaixuan
2025-07-05 17:25:22 +08:00
parent b688abce0b
commit e34179ba64
2 changed files with 121 additions and 2 deletions

View File

@@ -9,7 +9,48 @@ namespace SqlSugar.MongoDb
{
public class MongoDbExpTools
{
public static List<KeyValuePair<string, Expression>> ExtractIfElseEnd(MethodCallExpression expression)
{
var result = new List<KeyValuePair<string, Expression>>();
Visit(expression, result);
result.Reverse();
return result;
}
private static void Visit(Expression exp, List<KeyValuePair<string, Expression>> result)
{
if (exp == null) return;
if (exp is MethodCallExpression methodCall)
{
var methodName = methodCall.Method.Name.ToUpperInvariant();
if (methodName == "IF" || methodName == "ELSEIF")
{
// IF/ELSEIF 的表达式一般在第一个参数
result.Add(new KeyValuePair<string, Expression>(methodName, methodCall.Arguments[0]));
}
else if (methodName == "RETURN")
{
// END 的默认值一般在第一个参数
result.Add(new KeyValuePair<string, Expression>("RETURN", methodCall.Arguments[0]));
}
else if (methodName == "END")
{
// END 的默认值一般在第一个参数
result.Add(new KeyValuePair<string, Expression>("END", methodCall.Arguments[0]));
}
// 递归:链式调用的对象部分
Visit(methodCall.Object, result);
// 递归每个参数有时候Return里嵌套也可能有IF
foreach (var arg in methodCall.Arguments)
{
Visit(arg, result);
}
}
}
public static bool IsFieldNameJson(string trimmed)
{
return trimmed.StartsWith("{ \""+UtilConstants.FieldName+"\" : ");
@@ -85,7 +126,6 @@ namespace SqlSugar.MongoDb
return false;
}
public static bool GetIsMemember(Expression expr)
{
return expr is MemberExpression member && member.Expression is ParameterExpression;

View File

@@ -85,9 +85,88 @@ namespace SqlSugar.MongoDb
var value = context.DateAddByType(model);
result = BsonDocument.Parse(value?.ToString());
}
else if (name == "End")
{
var ifConditions = MongoDbExpTools.ExtractIfElseEnd(methodCallExpression);
return BuildMongoSwitch(ifConditions);
}
return result;
}
}
public BsonValue BuildMongoSwitch(List<KeyValuePair<string, Expression>> ifConditions)
{
if (ifConditions == null || ifConditions.Count < 3)
throw new ArgumentException("Insufficient conditions");
var branches = new BsonArray();
var context = _context;
int i = 0;
while (i < ifConditions.Count - 1)
{
var key = ifConditions[i].Key;
if (key == "IF" || key == "ELSEIF")
{
// 取当前条件
var caseExpr = MongoNestedTranslator.TranslateNoFieldName(
ifConditions[i].Value,
context,
new ExpressionVisitorContext { IsText = true }
);
// 取下一个RETURN
if (i + 1 >= ifConditions.Count)
throw new InvalidOperationException("Lacking RETURN");
var returnPair = ifConditions[i + 1];
if (returnPair.Key != "RETURN")
throw new InvalidOperationException("IF/ELSEIF Must follow RETURN");
var thenExpr = MongoNestedTranslator.TranslateNoFieldName(
returnPair.Value,
context,
new ExpressionVisitorContext { IsText = true }
);
if (MongoDbExpTools.GetIsMemember(returnPair.Value))
{
thenExpr = UtilMethods.GetMemberName(thenExpr);
}
branches.Add(new BsonDocument
{
{ "case", caseExpr },
{ "then", thenExpr }
});
i += 2; // 跳过 RETURN
}
else if (key == "END")
{
break;
}
else
{
throw new InvalidOperationException($"Not supported Key: {key}");
}
}
// END 的值作为 default
var defaultValue = MongoNestedTranslator.TranslateNoFieldName(
ifConditions.Last().Value,
context,
new ExpressionVisitorContext { IsText = true }
);
var switchDoc = new BsonDocument
{
{ "$switch", new BsonDocument
{
{ "branches", branches },
{ "default", defaultValue }
}
}
};
return switchDoc;
}
private static string TransformMethodName(MethodCallExpression methodCallExpression, string name)
{