Compare commits

...

3 Commits

Author SHA1 Message Date
sunkaixuan
32d83ec599 Update mongodb 2025-08-17 11:08:34 +08:00
sunkaixuan
cabc51d339 Add demo 2025-08-17 11:05:56 +08:00
sunkaixuan
dd91bee5b7 Add demo 2025-08-17 11:05:44 +08:00
2 changed files with 112 additions and 2 deletions

View File

@ -1,5 +1,7 @@
using MongoDB.Bson;
using MongoDb.Ado.data;
using MongoDB.Bson;
using MongoDB.Bson.Serialization.Attributes;
using MongoDB.Driver;
using SqlSugar;
using SqlSugar.MongoDb;
using System;
@ -24,6 +26,13 @@ namespace MongoDbTest
db.Updateable(list).ExecuteCommand();
var list2 = db.Queryable<Student>().ToList();
if (list2.First().Book[1] != 2.2) Cases.ThrowUnitError();
var list3=db.Queryable<Student>().Where(s => s.Book.Contains(1)).ToList();
var list4 = db.Queryable<Student2>().Where(s => s.Book.Any(s=>s==1)).ToList();
if(list3.Count != 1||list4.Count != 1) Cases.ThrowUnitError();
var list5 = db.Queryable<Student2>().Where(s => s.Book.Any(s => s == 11)).ToList();
var list6 = db.Queryable<Student>().Where(s => s.Book.Any(s => s == 11)).ToList();
if (list5.Count != 0 ) Cases.ThrowUnitError();
if (list6.Count != 0) Cases.ThrowUnitError();
}
[SqlSugar.SugarTable("UnitStudentdsafaz1")]
@ -33,6 +42,14 @@ namespace MongoDbTest
[SqlSugar.SugarColumn(IsJson = true)]
public List<double> Book { get; set; }
}
}
[SqlSugar.SugarTable("UnitStudentdsafaz1")]
public class Student2 : MongoDbBase
{
public string Name { get; set; }
[SqlSugar.SugarColumn(IsJson = true)]
public double[] Book { get; set; }
}
}
}

View File

@ -126,15 +126,108 @@ namespace SqlSugar.MongoDb
{
return HandleComplexAnyExpression(methodCallExpression);
}
else if (IsSimpleValueListAny(methodCallExpression))
{
return HandleSimpleValueListAny(methodCallExpression);
}
else
{
return ProcessAnyExpression(methodCallExpression);
}
}
return result;
}
}
private BsonValue HandleSimpleValueListAny(MethodCallExpression methodCallExpression)
{
var memberExpression = methodCallExpression.Arguments[0] as MemberExpression;
var lambdaExpression = methodCallExpression.Arguments[1] as LambdaExpression;
var paramName = lambdaExpression.Parameters.FirstOrDefault()?.Name;
// 集合字段名
var collectionField = MongoNestedTranslator.TranslateNoFieldName(
memberExpression,
_context,
new ExpressionVisitorContext { IsText = true }
)?.ToString();
// Lambda 表达式体
var body = lambdaExpression.Body;
if (body is BinaryExpression binaryExpr)
{
// 只处理 s == value 这种简单表达式
string mongoOperator = binaryExpr.NodeType switch
{
ExpressionType.Equal => "$in",
ExpressionType.NotEqual => "$nin",
_ => null
};
if (mongoOperator != null)
{
// s == value左边是参数右边是常量
var left = binaryExpr.Left;
var right = binaryExpr.Right;
if (left is ParameterExpression && right is ConstantExpression constant)
{
var value = UtilMethods.MyCreate(constant.Value);
var bson = new BsonDocument
{
{ collectionField, new BsonDocument(mongoOperator, new BsonArray { value }) }
};
return bson;
}
// s == it.xx 这种情况
if (left is ParameterExpression && right != null)
{
var valueExpr = MongoNestedTranslator.TranslateNoFieldName(
right,
_context,
new ExpressionVisitorContext { IsText = true }
);
var bson = new BsonDocument
{
{ collectionField, new BsonDocument(mongoOperator, new BsonArray { valueExpr }) }
};
return bson;
}
}
}
return null;
}
private static bool IsSimpleValueListAny(MethodCallExpression methodCallExpression)
{
if (methodCallExpression.Arguments.Count == 2)
{
var memberExpression = methodCallExpression.Arguments[0] as MemberExpression;
var lambdaExpression = methodCallExpression.Arguments[1] as LambdaExpression;
if (memberExpression != null && lambdaExpression != null)
{
var memberType = memberExpression.Type;
if (typeof(IEnumerable<string>).IsAssignableFrom(memberType) ||
typeof(IEnumerable<int>).IsAssignableFrom(memberType) ||
typeof(IEnumerable<long>).IsAssignableFrom(memberType) ||
typeof(IEnumerable<double>).IsAssignableFrom(memberType) ||
typeof(IEnumerable<float>).IsAssignableFrom(memberType) ||
typeof(IEnumerable<Guid>).IsAssignableFrom(memberType) ||
typeof(IEnumerable<decimal>).IsAssignableFrom(memberType))
{
// 判断 lambda 是否是 s => s == value 或 s => s != value
if (lambdaExpression.Body is BinaryExpression binaryExpr)
{
if ((binaryExpr.Left is ParameterExpression && binaryExpr.Right is ConstantExpression) ||
(binaryExpr.Left is ParameterExpression && binaryExpr.Right != null))
{
return true;
}
}
}
}
}
return false;
}
private BsonValue HandleComplexAnyExpression(MethodCallExpression methodCallExpression)
{
// 处理 it.Book.Any(s => s.Price == it.Age) 这种主表字段关联的 Any 表达式