mirror of
https://gitee.com/dotnetchina/SqlSugar.git
synced 2025-09-20 02:29:39 +08:00
Update mongodb
This commit is contained in:
@@ -22,12 +22,31 @@ namespace SqlSugar.MongoDb
|
|||||||
|
|
||||||
public BsonDocument Extract(BinaryExpression expr)
|
public BsonDocument Extract(BinaryExpression expr)
|
||||||
{
|
{
|
||||||
if (IsLogicalExpression(expr))
|
if (IsValidJsonEqualityExpression(expr))
|
||||||
|
return JsonEqualityExpression(expr);
|
||||||
|
else if (IsLogicalExpression(expr))
|
||||||
return LogicalBinaryExpression(expr);
|
return LogicalBinaryExpression(expr);
|
||||||
else
|
else
|
||||||
return FieldComparisonOrCalculationExpression(expr);
|
return FieldComparisonOrCalculationExpression(expr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private BsonDocument JsonEqualityExpression(BinaryExpression expr)
|
||||||
|
{
|
||||||
|
var fieldName = new ExpressionVisitor(_context).Visit(expr.Left);
|
||||||
|
|
||||||
|
// 步骤3:获取右侧常量值
|
||||||
|
object rightValue = ExpressionTool.DynamicInvoke(expr.Right);
|
||||||
|
|
||||||
|
var builder=InstanceFactory.GetInsertBuilder(this._context.context.CurrentConnectionConfig);
|
||||||
|
var json=builder.SerializeObjectFunc(rightValue);
|
||||||
|
return new BsonDocument(fieldName+"",UtilMethods.ParseJsonObject(json));
|
||||||
|
}
|
||||||
|
|
||||||
|
private bool IsValidJsonEqualityExpression(BinaryExpression expr)
|
||||||
|
{
|
||||||
|
return this._context?.context != null && expr.NodeType == ExpressionType.Equal && UtilMethods.IsJsonMember(expr.Left, this._context?.context) && ExpressionTool.GetParameters(expr.Right).Count == 0;
|
||||||
|
}
|
||||||
|
|
||||||
private static bool IsLogicalExpression(BinaryExpression expr)
|
private static bool IsLogicalExpression(BinaryExpression expr)
|
||||||
{
|
{
|
||||||
return expr.NodeType == ExpressionType.AndAlso || expr.NodeType == ExpressionType.OrElse;
|
return expr.NodeType == ExpressionType.AndAlso || expr.NodeType == ExpressionType.OrElse;
|
||||||
|
@@ -21,6 +21,19 @@ namespace SqlSugar.MongoDb
|
|||||||
{
|
{
|
||||||
public class UtilMethods
|
public class UtilMethods
|
||||||
{
|
{
|
||||||
|
internal static bool IsJsonMember(Expression expression, SqlSugarProvider context)
|
||||||
|
{
|
||||||
|
var member = expression as MemberExpression;
|
||||||
|
if (member == null)
|
||||||
|
return false;
|
||||||
|
if (!(member.Type.IsClass())||member.Type==typeof(string))
|
||||||
|
return false;
|
||||||
|
if (member.Expression == null)
|
||||||
|
return false;
|
||||||
|
var entity = context.EntityMaintenance.GetEntityInfo(member.Expression.Type);
|
||||||
|
var json = entity.Columns.FirstOrDefault(z => z.IsJson && z.PropertyName == member.Member.Name);
|
||||||
|
return json != null;
|
||||||
|
}
|
||||||
internal static SugarParameter GetParameterConverter(int index, ISqlSugarClient db, object value, Expression oppoSiteExpression, EntityColumnInfo columnInfo)
|
internal static SugarParameter GetParameterConverter(int index, ISqlSugarClient db, object value, Expression oppoSiteExpression, EntityColumnInfo columnInfo)
|
||||||
{
|
{
|
||||||
var entity = db.EntityMaintenance.GetEntityInfo(oppoSiteExpression.Type);
|
var entity = db.EntityMaintenance.GetEntityInfo(oppoSiteExpression.Type);
|
||||||
|
Reference in New Issue
Block a user