Update MongoDb

This commit is contained in:
sunkaixuan
2025-05-10 10:20:35 +08:00
parent 8285641274
commit dc6a3086ca
3 changed files with 74 additions and 21 deletions

View File

@@ -56,6 +56,18 @@ namespace MongoDbTest
.ExecuteCommand(); .ExecuteCommand();
var updateRow6 = db.Updateable<OrderInfo>()
.SetColumns(it => new OrderInfo { Name = it.Name, CreateTime = DateTime.Now })
.Where(it => it.Id == ids.Last())
.ExecuteCommand();
var updateRow7 = db.Updateable<OrderInfo>()
.SetColumns(it => new OrderInfo { Name = it.Name+"a", CreateTime = DateTime.Now })
.Where(it => it.Id == ids.Last())
.ExecuteCommand();
var delrow = db.Deleteable(new OrderInfo() { Id = ids.Last() }) var delrow = db.Deleteable(new OrderInfo() { Id = ids.Last() })
.ExecuteCommand(); .ExecuteCommand();

View File

@@ -56,14 +56,29 @@ namespace SqlSugar.MongoDbCore
} }
private BsonDocument FieldComparisonExpression(BinaryExpression expr) private BsonDocument FieldComparisonExpression(BinaryExpression expr)
{
BsonValue field, value;
bool leftIsMember, rightIsMember;
string op;
OutParameters(expr, out field, out value, out leftIsMember, out rightIsMember, out op);
if (op == null)
{
return GetCalculationOperation(field, expr.NodeType, value);
}
else
{
return GetComparisonOperation(expr, field, value, leftIsMember, rightIsMember, op);
}
}
private void OutParameters(BinaryExpression expr, out BsonValue field, out BsonValue value, out bool leftIsMember, out bool rightIsMember, out string op)
{ {
var left = new ExpressionVisitor(_context, new ExpressionVisitorContext()); var left = new ExpressionVisitor(_context, new ExpressionVisitorContext());
var right = new ExpressionVisitor(_context, new ExpressionVisitorContext()); var right = new ExpressionVisitor(_context, new ExpressionVisitorContext());
BsonValue field = left.Visit(expr.Left); field = left.Visit(expr.Left);
BsonValue value = right.Visit(expr.Right); value = right.Visit(expr.Right);
bool leftIsMember = false; leftIsMember = false;
bool rightIsMember = false; rightIsMember = false;
if (left?.visitorContext?.ExpType == typeof(MemberExpression)) if (left?.visitorContext?.ExpType == typeof(MemberExpression))
{ {
leftIsMember = true; leftIsMember = true;
@@ -74,7 +89,7 @@ namespace SqlSugar.MongoDbCore
rightIsMember = true; rightIsMember = true;
} }
string op = expr.NodeType switch op = expr.NodeType switch
{ {
ExpressionType.Equal => "$eq", ExpressionType.Equal => "$eq",
ExpressionType.NotEqual => "$ne", ExpressionType.NotEqual => "$ne",
@@ -82,11 +97,12 @@ namespace SqlSugar.MongoDbCore
ExpressionType.GreaterThanOrEqual => "$gte", ExpressionType.GreaterThanOrEqual => "$gte",
ExpressionType.LessThan => "$lt", ExpressionType.LessThan => "$lt",
ExpressionType.LessThanOrEqual => "$lte", ExpressionType.LessThanOrEqual => "$lte",
_ => throw new NotSupportedException($"Unsupported binary op: {expr.NodeType}") _ => null
}; };
}
private BsonDocument GetComparisonOperation(BinaryExpression expr, BsonValue field, BsonValue value, bool leftIsMember, bool rightIsMember, string op)
{
string leftValue = ""; string leftValue = "";
BsonValue rightValue = ""; BsonValue rightValue = "";
if (IsLeftValue(leftIsMember, rightIsMember, op) || IsRightValue(leftIsMember, rightIsMember, op)) if (IsLeftValue(leftIsMember, rightIsMember, op) || IsRightValue(leftIsMember, rightIsMember, op))
@@ -134,6 +150,24 @@ namespace SqlSugar.MongoDbCore
} }
} }
private BsonDocument GetCalculationOperation(BsonValue field, ExpressionType nodeType, BsonValue value)
{
string operation = nodeType switch
{
ExpressionType.Add => "$add",
ExpressionType.Subtract => "$subtract",
ExpressionType.Multiply => "$multiply",
ExpressionType.Divide => "$divide",
ExpressionType.Modulo => "$mod",
_ => throw new NotSupportedException($"Unsupported calculation operation: {nodeType}")
};
return new BsonDocument
{
{ field.ToString(), new BsonDocument { { operation, value } } }
};
}
private static bool IsRightValue(bool leftIsMember, bool rightIsMember, string op) private static bool IsRightValue(bool leftIsMember, bool rightIsMember, string op)
{ {
return rightIsMember && !leftIsMember; return rightIsMember && !leftIsMember;

View File

@@ -26,7 +26,7 @@ namespace SqlSugar.MongoDbCore
throw new Exception(""); throw new Exception("");
} }
private static BsonValue Update(Expression expr) private BsonValue Update(Expression expr)
{ {
var exp = expr as MemberInitExpression; var exp = expr as MemberInitExpression;
var setDocument = new BsonDocument(); var setDocument = new BsonDocument();
@@ -35,10 +35,17 @@ namespace SqlSugar.MongoDbCore
if (binding is MemberAssignment assignment) if (binding is MemberAssignment assignment)
{ {
var fieldName = assignment.Member.Name; var fieldName = assignment.Member.Name;
var fieldValue = Expression.Lambda(assignment.Expression).Compile().DynamicInvoke(); var fieldValue =new ExpressionVisitor(_context,_visitorContext).Visit(Expression.Lambda(assignment.Expression));
if (assignment.Expression is MemberExpression && ExpressionTool.GetParameters(assignment.Expression).Count > 0)
{
setDocument[fieldName] = new BsonDocument("$getField", fieldValue);
}
else
{
setDocument[fieldName] = BsonValue.Create(fieldValue); setDocument[fieldName] = BsonValue.Create(fieldValue);
} }
} }
}
return new BsonDocument("$set", setDocument); return new BsonDocument("$set", setDocument);
} }
} }