diff --git a/Src/Asp.NetCore2/SqlSugar.MongoDbCore/ExpToSql/Models/AnyArgModel.cs b/Src/Asp.NetCore2/SqlSugar.MongoDbCore/ExpToSql/Models/AnyArgModel.cs new file mode 100644 index 000000000..d50798c54 --- /dev/null +++ b/Src/Asp.NetCore2/SqlSugar.MongoDbCore/ExpToSql/Models/AnyArgModel.cs @@ -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; } + } +} diff --git a/Src/Asp.NetCore2/SqlSugar.MongoDbCore/ExpToSql/VisitorItems/MethodCallExpressionTractor.cs b/Src/Asp.NetCore2/SqlSugar.MongoDbCore/ExpToSql/VisitorItems/MethodCallExpressionTractor.cs index c5dd1e770..449919c8b 100644 --- a/Src/Asp.NetCore2/SqlSugar.MongoDbCore/ExpToSql/VisitorItems/MethodCallExpressionTractor.cs +++ b/Src/Asp.NetCore2/SqlSugar.MongoDbCore/ExpToSql/VisitorItems/MethodCallExpressionTractor.cs @@ -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;