Update mongodb

This commit is contained in:
sunkaixuan
2025-08-23 20:00:13 +08:00
parent 9ec7b1f2b8
commit 283782c5b6
2 changed files with 68 additions and 9 deletions

View File

@@ -0,0 +1,18 @@
using System;
using System.Collections.Generic;
using System.Linq.Expressions;
using System.Text;
namespace SqlSugar.MongoDb
{
public class AnyArgModel
{
public bool IsBinary { get; internal set; }
public LambdaExpression LamdaExpression { get; internal set; }
public Expression Left { get; internal set; }
public Expression Right { get; internal set; }
public ExpressionType NodeType { get; internal set; }
public int LeftCount { get; internal set; }
public int RightCount { get; internal set; }
}
}

View File

@@ -122,10 +122,14 @@ namespace SqlSugar.MongoDb
}
else if (IsAnyMethodCall(methodCallExpression, name))
{
if (IsComplexAnyExpression(methodCallExpression))
if (IsComplexAnyExpression(methodCallExpression, out AnyArgModel anyArgModel))
{
return HandleComplexAnyExpression(methodCallExpression);
}
else if (IsUnresolvableAnyExpression(anyArgModel))
{
return UnresolvablelexAnyExpression(methodCallExpression);
}
else if (IsSimpleValueListAny(methodCallExpression))
{
return HandleSimpleValueListAny(methodCallExpression);
@@ -163,6 +167,12 @@ namespace SqlSugar.MongoDb
}
}
private BsonValue UnresolvablelexAnyExpression(MethodCallExpression methodCallExpression)
{
BsonValue bsonValue = null;
return null;
}
private BsonValue HandleSimpleValueListAny(MethodCallExpression methodCallExpression)
{
var memberExpression = methodCallExpression.Arguments[0] as MemberExpression;
@@ -312,25 +322,46 @@ namespace SqlSugar.MongoDb
return null;
}
private static bool IsComplexAnyExpression(MethodCallExpression methodCallExpression)
private static bool IsComplexAnyExpression(MethodCallExpression methodCallExpression, out AnyArgModel anyArgModel)
{
anyArgModel=new AnyArgModel() { IsBinary = false };
if (methodCallExpression.Arguments.Count != 2)
return false;
var isTwoMemeber=ExpressionTool.GetParameters(methodCallExpression.Arguments[1]).Select(s => s.Name).Distinct().Count() == 2;
if (!isTwoMemeber)
{
if (methodCallExpression.Arguments[1] is LambdaExpression la && la.Body is BinaryExpression bin)
{
var leftCount = ExpressionTool.GetParameters(MongoDbExpTools.RemoveConvert(bin.Left)).Count();
var rightCount = ExpressionTool.GetParameters(MongoDbExpTools.RemoveConvert(bin.Right)).Count();
anyArgModel.IsBinary = true;
anyArgModel.LamdaExpression = la;
anyArgModel.Left = MongoDbExpTools.RemoveConvert(bin.Left);
anyArgModel.LeftCount = leftCount;
anyArgModel.RightCount = rightCount;
anyArgModel.Right = MongoDbExpTools.RemoveConvert(bin.Right);
anyArgModel.NodeType = bin.NodeType;
}
return false;
}
if (methodCallExpression.Arguments[1] is LambdaExpression l&&l.Body is BinaryExpression b)
{
if (MongoDbExpTools.RemoveConvert(b.Left) is MemberExpression == false||ExpressionTool.GetParameters(MongoDbExpTools.RemoveConvert(b.Left)).Count()!=1)
{
var leftCount = ExpressionTool.GetParameters(MongoDbExpTools.RemoveConvert(b.Left)).Count();
var rightCount = ExpressionTool.GetParameters(MongoDbExpTools.RemoveConvert(b.Right)).Count();
if (MongoDbExpTools.RemoveConvert(b.Left) is MemberExpression lm== false|| leftCount != 1)
return false;
}
if (MongoDbExpTools.RemoveConvert(b.Right) is MemberExpression == false || ExpressionTool.GetParameters(MongoDbExpTools.RemoveConvert(b.Right)).Count() != 1)
{
if (MongoDbExpTools.RemoveConvert(b.Right) is MemberExpression lr== false || rightCount != 1)
return false;
}
anyArgModel.IsBinary = true;
anyArgModel.LamdaExpression = l;
anyArgModel.Left = lm;
anyArgModel.LeftCount = leftCount;
anyArgModel.RightCount = rightCount;
anyArgModel.Right = lr;
anyArgModel.NodeType = b.NodeType;
}
return true;
}
@@ -468,6 +499,16 @@ namespace SqlSugar.MongoDb
return name;
}
private bool IsUnresolvableAnyExpression(AnyArgModel anyArgModel)
{
var leftIsUn = !(anyArgModel.Left is MemberExpression) && anyArgModel.LeftCount >= 1;
var rightIsUn = !(anyArgModel.Right is MemberExpression) && anyArgModel.LeftCount >= 1;
if (leftIsUn|| rightIsUn)
{
return true;
}
return false;
}
private static bool IsAnyMethodCall(MethodCallExpression methodCallExpression, string name)
{
return name == "Any" && methodCallExpression.Arguments.Count == 2;