mirror of
https://gitee.com/dotnetchina/SqlSugar.git
synced 2025-09-19 10:08:19 +08:00
Update mongodb
This commit is contained in:
@@ -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
|
||||
|
@@ -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}");
|
||||
}
|
||||
|
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@@ -0,0 +1,10 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Text;
|
||||
|
||||
namespace SqlSugar.MongoDbCore
|
||||
{
|
||||
public class MongoNestedTranslatorContext
|
||||
{
|
||||
}
|
||||
}
|
@@ -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
|
||||
{
|
||||
|
@@ -6,9 +6,16 @@ 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;
|
||||
|
@@ -6,9 +6,14 @@ 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);
|
||||
}
|
||||
|
Reference in New Issue
Block a user