Update mongodb

This commit is contained in:
sunkaixuan
2025-05-04 14:34:51 +08:00
parent 6f3e210f75
commit 332808ce60
7 changed files with 65 additions and 26 deletions

View File

@@ -15,18 +15,21 @@ namespace MongoDbTest
public static void Init()
{
Expression<Func<Order, bool>> exp = it=>it.Id==1||it.Name=="a";
var json=MongoNestedTranslator.Translate(exp);
var json=MongoNestedTranslator.Translate(exp,null);
var Order = new Order() { Id = 1 };
Expression<Func<Order, bool>> exp2 = it => it.Id == Order.Id || it.Name == "a";
var json2 = MongoNestedTranslator.Translate(exp2);
var json2 = MongoNestedTranslator.Translate(exp2, null);
Expression<Func<Order, bool>> exp3 = it=> it.IsValidate==true;
var json23 = MongoNestedTranslator.Translate(exp3);
var json23 = MongoNestedTranslator.Translate(exp3, null);
Expression<Func<Order, bool>> exp4 = it => it.IsValidate != true;
var json24 = MongoNestedTranslator.Translate(exp4);
var json24 = MongoNestedTranslator.Translate(exp4, null);
Expression<Func<Order, bool>> exp5 = it =>1==it.Id;
var json5 = MongoNestedTranslator.Translate(exp5, null);
}
}
public class Order

View File

@@ -7,23 +7,30 @@ using System.Text;
namespace SqlSugar.MongoDbCore
{
public static class ExpressionVisitor
public class ExpressionVisitor
{
public static JToken Visit(Expression expr)
private MongoNestedTranslatorContext context;
public ExpressionVisitor(MongoNestedTranslatorContext context)
{
this.context = context;
}
public JToken Visit(Expression expr)
{
expr = MongoDbExpTools.RemoveConvert(expr);
switch (expr)
{
case BinaryExpression binary:
return BinaryExpressionTranslator.Translate(binary);
return new BinaryExpressionTranslator(context).Extract(binary);
case MemberExpression member:
return FieldPathExtractor.GetFieldPath(member);
return new FieldPathExtractor(context).Extract(member);
case ConstantExpression constant:
return ValueExtractor.GetValue(constant);
return new ValueExtractor(context).Extract(constant);
case UnaryExpression unary:
return Visit(unary);
return this.Visit(unary);
case LambdaExpression lambda:
return Visit((lambda as LambdaExpression).Body);
return this.Visit((lambda as LambdaExpression).Body);
default:
throw new NotSupportedException($"Unsupported expression: {expr.NodeType}");
}

View File

@@ -9,9 +9,9 @@ namespace SqlSugar.MongoDbCore
public static class MongoNestedTranslator
{
public static JObject Translate(Expression expr)
public static JObject Translate(Expression expr, MongoNestedTranslatorContext context)
{
return (JObject)ExpressionVisitor.Visit(expr);
return (JObject)new ExpressionVisitor(context).Visit(expr);
}
}
}

View File

@@ -0,0 +1,10 @@
using System;
using System.Collections.Generic;
using System.Text;
namespace SqlSugar.MongoDbCore
{
public class MongoNestedTranslatorContext
{
}
}

View File

@@ -6,9 +6,16 @@ using System.Text;
namespace SqlSugar.MongoDbCore.ExpToSql.VisitorItems
{
public static class BinaryExpressionTranslator
public class BinaryExpressionTranslator
{
public static JToken Translate(BinaryExpression expr)
MongoNestedTranslatorContext _context;
public BinaryExpressionTranslator(MongoNestedTranslatorContext context)
{
_context = context;
}
public JToken Extract(BinaryExpression expr)
{
if (expr.NodeType == ExpressionType.AndAlso || expr.NodeType == ExpressionType.OrElse)
{
@@ -18,12 +25,12 @@ namespace SqlSugar.MongoDbCore.ExpToSql.VisitorItems
return FieldComparisonExpression(expr);
}
private static JToken LogicalBinaryExpression(BinaryExpression expr)
private JToken LogicalBinaryExpression(BinaryExpression expr)
{
string logicOp = expr.NodeType == ExpressionType.AndAlso ? "$and" : "$or";
var left = ExpressionVisitor.Visit(expr.Left);
var right = ExpressionVisitor.Visit(expr.Right);
var left = new ExpressionVisitor(_context).Visit(expr.Left);
var right =new ExpressionVisitor(_context).Visit(expr.Right);
var arr = new JArray();
AddNestedLogic(arr, left, logicOp);
@@ -32,7 +39,7 @@ namespace SqlSugar.MongoDbCore.ExpToSql.VisitorItems
return new JObject { [logicOp] = arr };
}
private static void AddNestedLogic(JArray arr, JToken token, string logicOp)
private void AddNestedLogic(JArray arr, JToken token, string logicOp)
{
if (token is JObject obj && obj.TryGetValue(logicOp, out var nested) && nested is JArray nestedArr)
{
@@ -44,10 +51,10 @@ namespace SqlSugar.MongoDbCore.ExpToSql.VisitorItems
}
}
private static JToken FieldComparisonExpression(BinaryExpression expr)
private JToken FieldComparisonExpression(BinaryExpression expr)
{
string field = FieldPathExtractor.GetFieldPath(expr.Left);
JToken value = ExpressionVisitor.Visit(expr.Right);
string field = new FieldPathExtractor(_context).Extract(expr.Left);
JToken value = new ExpressionVisitor(_context).Visit(expr.Right);
string op = expr.NodeType switch
{

View File

@@ -6,10 +6,17 @@ using System.Text;
namespace SqlSugar.MongoDbCore.ExpToSql.VisitorItems
{
public static class FieldPathExtractor
public class FieldPathExtractor
{
public static string GetFieldPath(Expression expr)
MongoNestedTranslatorContext _context;
public FieldPathExtractor(MongoNestedTranslatorContext context)
{
_context = context;
}
public string Extract(Expression expr)
{
var oldExp = expr;
var oldMember = expr as MemberExpression;
var parts = new Stack<string>();

View File

@@ -6,10 +6,15 @@ using System.Text;
namespace SqlSugar.MongoDbCore.ExpToSql.VisitorItems
{
public static class ValueExtractor
public class ValueExtractor
{
public static JToken GetValue(ConstantExpression expr)
MongoNestedTranslatorContext _context;
public ValueExtractor(MongoNestedTranslatorContext context)
{
_context = context;
}
public JToken Extract(ConstantExpression expr)
{
return JToken.FromObject(expr.Value);
}