我正在使用Dynamic Linq用基于用户输入的过滤器创建的字符串查询我们的数据库。在一种情况下,我们需要在两个字段上执行合并,以便将过滤器应用于结果。

产生的语法如下所示:

(nullableField ?? requiredField) == "foo"


或者,如果使用扩展方法:

(nullableField ?? requiredField).Contains("foo")


Dynamic Linq,或者至少是我们项目中当前使用的版本,不支持合并,是否有任何可用的实现或关于如何实现自己的建议?我对表达式的经验很少,并且正在努力创建自己的表达式。到目前为止,以下代码在有限的测试中仍然有效,但是我不确定是否正确执行了。

这由ParseExpression()调用:

    // ?? operator
    Expression ParseCoalesce()
    {
        Expression left = ParseLogicalOr();
        if (token.id == TokenId.DoubleQuestion)
        {
            NextToken();
            Expression expr1 = ParseExpression();
            left = Expression.Coalesce(left, expr1);
        }
        return left;
    }


对这个代码有何想法?有更好的方法吗?

最佳答案

如果您的系统支持ConditionalExpression,则可以将其实现为

(nullableField != null ? nullableField == "foo" : requiredField == "foo")


要么

(nullableField != null ? nullableField : requiredField) == "foo"

10-07 23:16