mirror of
https://gitee.com/dotnetchina/SqlSugar.git
synced 2025-08-20 09:28:53 +08:00
Compare commits
3 Commits
9c472934eb
...
32d83ec599
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
32d83ec599 | ||
|
|
cabc51d339 | ||
|
|
dd91bee5b7 |
@ -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; }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -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 表达式
|
||||
|
||||
Loading…
Reference in New Issue
Block a user