diff --git a/Src/Asp.NetCore2/MongoDbTest/UnitTest/QueryWhere.cs b/Src/Asp.NetCore2/MongoDbTest/UnitTest/QueryWhere.cs index 6ff93f4b0..348dfd2e2 100644 --- a/Src/Asp.NetCore2/MongoDbTest/UnitTest/QueryWhere.cs +++ b/Src/Asp.NetCore2/MongoDbTest/UnitTest/QueryWhere.cs @@ -66,8 +66,17 @@ namespace MongoDbTest var dt = DateTime.Now.AddDays(-10).Date; var list70=db.Queryable().ToList().Where(it => it.CreateDateTime.Date == dt).ToList(); - var list71 = db.Queryable().Where(it => it.CreateDateTime.Date == dt).ToList(); + var list71 = db.Queryable().Where(it => it.CreateDateTime.Date == dt).ToList(); + if (list71.Count != list70.Count) Cases.ThrowUnitError(); + + var ids=list71.Select(it => it.Id).ToList(); + var list72 = db.Queryable().Where(it => ids.Contains(it.Id)).ToList(); + if(list72.Count!=ids.Count) Cases.ThrowUnitError(); + + var ids2 = db.Queryable().Select(it => it.Id).ToList(); + var list73 = db.Queryable().Where(it => ids2.Contains(it.Id)).ToList(); + if (list73.Count != ids2.Count) Cases.ThrowUnitError(); } private static void ValidateStudentData(SqlSugar.SqlSugarClient db) diff --git a/Src/Asp.NetCore2/SqlSugar.MongoDbCore/ExpToSql/VisitorItems/MethodCallExpressionTractor.cs b/Src/Asp.NetCore2/SqlSugar.MongoDbCore/ExpToSql/VisitorItems/MethodCallExpressionTractor.cs index da1afdb51..be72f8cd0 100644 --- a/Src/Asp.NetCore2/SqlSugar.MongoDbCore/ExpToSql/VisitorItems/MethodCallExpressionTractor.cs +++ b/Src/Asp.NetCore2/SqlSugar.MongoDbCore/ExpToSql/VisitorItems/MethodCallExpressionTractor.cs @@ -4,6 +4,8 @@ using System.Collections.Generic; using System.Linq.Expressions; using System.Text; using System.Linq; +using static Dm.net.buffer.ByteArrayBuffer; +using System.Collections; namespace SqlSugar.MongoDb { public class MethodCallExpressionTractor @@ -25,8 +27,7 @@ namespace SqlSugar.MongoDb { var methodCallExpression = expr as MethodCallExpression; var name = methodCallExpression.Method.Name; - if (name == "ToDateTime") - name = "ToDate"; + name = TransformMethodName(methodCallExpression, name); BsonValue result = null; var context = new MongoDbMethod() { context = this._context }; MethodCallExpressionModel model = new MethodCallExpressionModel(); @@ -87,5 +88,19 @@ namespace SqlSugar.MongoDb return result; } } + + private static string TransformMethodName(MethodCallExpression methodCallExpression, string name) + { + if (name == "ToDateTime") + name = "ToDate"; + if (name == "Contains" && methodCallExpression.Arguments.Count == 1 + && methodCallExpression?.Object?.Type != null + && ExpressionTool.GetParameters(methodCallExpression.Object).Count == 0 + && typeof(IEnumerable).IsAssignableFrom(methodCallExpression.Object.Type)) + { + name = "ContainsArray"; + } + return name; + } } } diff --git a/Src/Asp.NetCore2/SqlSugar.MongoDbCore/MongoDb/SqlBuilder/MongoDbExpressionContext.cs b/Src/Asp.NetCore2/SqlSugar.MongoDbCore/MongoDb/SqlBuilder/MongoDbExpressionContext.cs index 16b8bb8a6..5c800b24f 100644 --- a/Src/Asp.NetCore2/SqlSugar.MongoDbCore/MongoDb/SqlBuilder/MongoDbExpressionContext.cs +++ b/Src/Asp.NetCore2/SqlSugar.MongoDbCore/MongoDb/SqlBuilder/MongoDbExpressionContext.cs @@ -6,6 +6,7 @@ using System.Linq; using System.Linq.Expressions; using System.Text.RegularExpressions; using Microsoft.IdentityModel.Tokens; +using System.Collections; namespace SqlSugar.MongoDb { public class MongoDbExpressionContext : ExpressionContext, ILambdaExpressions @@ -593,6 +594,44 @@ namespace SqlSugar.MongoDb return trimDoc.ToJson(UtilMethods.GetJsonWriterSettings()); } + public override string ContainsArray(MethodCallExpressionModel model) + { + // 解析数组表达式和待判断的元素表达式 + var arrayExp = model.DataObject as Expression; + var itemExp = model.Args[0].MemberValue as Expression; + + // 获取字段名 + BsonValue fieldName = new ExpressionVisitor(context).Visit(itemExp); + + // 获取数组值 + var arrayObj = ExpressionTool.DynamicInvoke(arrayExp) as IEnumerable; + if (arrayObj == null) + return null; + var name=fieldName.ToString(); + // 构建BsonArray + var bsonArray = new BsonArray(); + foreach (var val in arrayObj) + { + if (val == null) + bsonArray.Add(BsonNull.Value); + else if (name == "_id") + { + bsonArray.Add(BsonValue.Create(ObjectId.Parse(val?.ToString()))); + } + else + bsonArray.Add(BsonValue.Create(val)); + } + + // 构建MongoDB的 $in 查询表达式 + var inDoc = new BsonDocument(name, new BsonDocument("$in", bsonArray)); + return inDoc.ToJson(UtilMethods.GetJsonWriterSettings()); + } + + public override string ContainsArrayUseSqlParameters(MethodCallExpressionModel model) + { + return this.ContainsArray(model); + } + #region Helper private static BsonValue GetMemberName(BsonValue memberName) {