我正在使用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"