mirror of
https://gitee.com/dotnetchina/SqlSugar.git
synced 2025-09-23 04:23:47 +08:00
Update mongodb
This commit is contained in:
@@ -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;
|
||||
|
@@ -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)
|
||||
{
|
||||
|
Reference in New Issue
Block a user