Update mongodb

This commit is contained in:
sunkaixuan
2025-08-20 16:55:16 +08:00
parent 372340c0bb
commit cfd391c21a
2 changed files with 33 additions and 1 deletions

View File

@@ -22,12 +22,31 @@ namespace SqlSugar.MongoDb
public BsonDocument Extract(BinaryExpression expr) public BsonDocument Extract(BinaryExpression expr)
{ {
if (IsLogicalExpression(expr)) if (IsValidJsonEqualityExpression(expr))
return JsonEqualityExpression(expr);
else if (IsLogicalExpression(expr))
return LogicalBinaryExpression(expr); return LogicalBinaryExpression(expr);
else else
return FieldComparisonOrCalculationExpression(expr); return FieldComparisonOrCalculationExpression(expr);
} }
private BsonDocument JsonEqualityExpression(BinaryExpression expr)
{
var fieldName = new ExpressionVisitor(_context).Visit(expr.Left);
// 步骤3获取右侧常量值
object rightValue = ExpressionTool.DynamicInvoke(expr.Right);
var builder=InstanceFactory.GetInsertBuilder(this._context.context.CurrentConnectionConfig);
var json=builder.SerializeObjectFunc(rightValue);
return new BsonDocument(fieldName+"",UtilMethods.ParseJsonObject(json));
}
private bool IsValidJsonEqualityExpression(BinaryExpression expr)
{
return this._context?.context != null && expr.NodeType == ExpressionType.Equal && UtilMethods.IsJsonMember(expr.Left, this._context?.context) && ExpressionTool.GetParameters(expr.Right).Count == 0;
}
private static bool IsLogicalExpression(BinaryExpression expr) private static bool IsLogicalExpression(BinaryExpression expr)
{ {
return expr.NodeType == ExpressionType.AndAlso || expr.NodeType == ExpressionType.OrElse; return expr.NodeType == ExpressionType.AndAlso || expr.NodeType == ExpressionType.OrElse;

View File

@@ -21,6 +21,19 @@ namespace SqlSugar.MongoDb
{ {
public class UtilMethods public class UtilMethods
{ {
internal static bool IsJsonMember(Expression expression, SqlSugarProvider context)
{
var member = expression as MemberExpression;
if (member == null)
return false;
if (!(member.Type.IsClass())||member.Type==typeof(string))
return false;
if (member.Expression == null)
return false;
var entity = context.EntityMaintenance.GetEntityInfo(member.Expression.Type);
var json = entity.Columns.FirstOrDefault(z => z.IsJson && z.PropertyName == member.Member.Name);
return json != null;
}
internal static SugarParameter GetParameterConverter(int index, ISqlSugarClient db, object value, Expression oppoSiteExpression, EntityColumnInfo columnInfo) internal static SugarParameter GetParameterConverter(int index, ISqlSugarClient db, object value, Expression oppoSiteExpression, EntityColumnInfo columnInfo)
{ {
var entity = db.EntityMaintenance.GetEntityInfo(oppoSiteExpression.Type); var entity = db.EntityMaintenance.GetEntityInfo(oppoSiteExpression.Type);