其他人可能有同样的问题。我通过将 last 保存BinaryExpression
到变量中解决了这个问题 这将解决以下不同的布尔子句
其中(f => f.IsActive == true || !f.IsActive == false || (f.Name == "adfd") && (f.IsActive || !f.IsBin) )
这是处理独立布尔值的代码
private string GetFilterMember(MemberExpression exp)
{
var str = exp.ToString();
if (str.Count(f => f == '.') > 1)
{
var expType = exp.Type;
var declareType = exp.Member.DeclaringType;
if (declareType == typeof(string))
{
if (exp.Member.Name == StringMethods.Length)
{
return $"{StringMethods.GetODataMethod(StringMethods.Length)}({exp.NameLeftPart()})";
}
}
else if (declareType == typeof(DateTime))
{
}
}
if (exp.Type == typeof(bool))
{
if (prviousBinaryExp != null && (prviousBinaryExp.Left == exp || prviousBinaryExp.Right == exp || (prviousBinaryExp.Left.NodeType == ExpressionType.Not && ((UnaryExpression)prviousBinaryExp.Left).Operand == exp) || (prviousBinaryExp.Right.NodeType == ExpressionType.Not && ((UnaryExpression)prviousBinaryExp.Right).Operand == exp)) && (prviousBinaryExp.NodeType != ExpressionType.Equal && prviousBinaryExp.NodeType != ExpressionType.NotEqual))
{
return $"{exp.Member.Name}{ODataQueryOperator.Equal}{FilterBuilder(Expression.Constant(true))}";
}
}
return exp.Member.Name;
}
BinaryExpression prviousBinaryExp = null;
protected virtual string FilterBuilder(Expression exp)
{
switch (exp.NodeType)
{
case ExpressionType.OrElse:
case ExpressionType.AndAlso:
case ExpressionType.Equal:
prviousBinaryExp = (BinaryExpression)exp;
return BinaryExpressionBuilder(((BinaryExpression)exp).Left, ODataQueryOperator.GetLogicalOperator(exp.NodeType), ((BinaryExpression)exp).Right);
case ExpressionType.Constant:
return GetConstant(exp.Type, ((ConstantExpression)exp).Value);
case ExpressionType.MemberAccess:
return GetFilterMember((MemberExpression)exp);
case ExpressionType.Not:
return UnaryExpressionBuilder((UnaryExpression)exp);
case ExpressionType.Call:
return MethodBuilder((MethodCallExpression)exp);
default:
return string.Empty;
}
}
不向下这个变量BinaryExpression prviousBinaryExp = null;
当你点击BinaryExpression
然后将该表达式保存在上面的变量中
case ExpressionType.OrElse:
case ExpressionType.AndAlso:
case ExpressionType.Equal:
prviousBinaryExp = (BinaryExpression)exp;
return BinaryExpressionBuilder(((BinaryExpression)exp).Left, ODataQueryOperator.GetLogicalOperator(exp.NodeType), ((BinaryExpression)exp).Right);
这是检查先前表达式是否为 binaryexpression 并且当前表达式是否为BinaryExpression's
Left
orRight
表达式的一部分的逻辑。我们将检查Nodtype
哪个不应该是ExpressionType.Equal
和ExpressionType.NotEqual
(f.IsActive == true)。我们还将确保 ifLeft
和Right
of BinaryExpression
is UnaryExpression
than 我们将检查它UnaryExpression.Operand
是否等于当前表达式。这将处理 !f.Enabled 或 !f.IsActive 等。
最后,我将 Expression 转换为 OData 等效字符串。哪个是
// converted String IsActive to OData equivalent
// IsActive eq true
return $"{exp.Member.Name}{ODataQueryOperator.Equal}{FilterBuilder(Expression.Constant(true))}";