如何忽略 lambda 表达式中转换为可为空的情况?

Fer*_*rte 5 c# expression expression-trees linq-expressions

我正在尝试构建 Odata 表达式的解析器,当字段可为空时,我收到错误。

public class UserRight
{
    public bool? active
}

public void Test(){
    Expression<Func<UserRight, bool>> expression = p => p.Active == true;
}
Run Code Online (Sandbox Code Playgroud)

它生成了以下表达式:

{p => (p.Active == Convert(True, Nullable`1))}
Run Code Online (Sandbox Code Playgroud)

但我想收到它

{p => (p.Active == True)}
Run Code Online (Sandbox Code Playgroud)

为了避免这种“转换”。有没有简单的方法可以做到这一点?因为我的解析器已经准备好了,我不想仅仅因为一个可为空的字段而重建它。

Ser*_*rvy 4

不,没有办法避免它。您调用的运算符接受 a bool?bool而不是 a ,因此参数必须是 a bool?,否则无法编译。有一个从boolto 的隐式转换bool?,这可以从转换表达式中看出。如果没有这种隐式转换,它就不是一个有效的表达式。

理论上,您可以手动构造自己的表达式,该表达式使用真正的可为空布尔常量值,但是没有办法使 lambda “自动”生成这样的表达式,并且尝试创建该新表达式几乎肯定比简单地创建新表达式要工作得多。您的查询提供程序处理转换表达式。