mirror of
https://gitee.com/dotnetchina/SqlSugar.git
synced 2025-09-24 04:53:45 +08:00
Update mongodb
This commit is contained in:
@@ -9,7 +9,48 @@ namespace SqlSugar.MongoDb
|
|||||||
{
|
{
|
||||||
public class MongoDbExpTools
|
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)
|
public static bool IsFieldNameJson(string trimmed)
|
||||||
{
|
{
|
||||||
return trimmed.StartsWith("{ \""+UtilConstants.FieldName+"\" : ");
|
return trimmed.StartsWith("{ \""+UtilConstants.FieldName+"\" : ");
|
||||||
@@ -85,7 +126,6 @@ namespace SqlSugar.MongoDb
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
public static bool GetIsMemember(Expression expr)
|
public static bool GetIsMemember(Expression expr)
|
||||||
{
|
{
|
||||||
return expr is MemberExpression member && member.Expression is ParameterExpression;
|
return expr is MemberExpression member && member.Expression is ParameterExpression;
|
||||||
|
@@ -85,9 +85,88 @@ namespace SqlSugar.MongoDb
|
|||||||
var value = context.DateAddByType(model);
|
var value = context.DateAddByType(model);
|
||||||
result = BsonDocument.Parse(value?.ToString());
|
result = BsonDocument.Parse(value?.ToString());
|
||||||
}
|
}
|
||||||
|
else if (name == "End")
|
||||||
|
{
|
||||||
|
var ifConditions = MongoDbExpTools.ExtractIfElseEnd(methodCallExpression);
|
||||||
|
return BuildMongoSwitch(ifConditions);
|
||||||
|
}
|
||||||
return result;
|
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)
|
private static string TransformMethodName(MethodCallExpression methodCallExpression, string name)
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user