猿问

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

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


public class UserRight

{

    public bool? active

}


public void Test(){

    Expression<Func<UserRight, bool>> expression = p => p.Active == true;

}

它为我生成以下表达式:


{p => (p.Active == Convert(True, Nullable`1))}

但我想收到它作为


{p => (p.Active == True)}

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


暮色呼如
浏览 317回答 3
3回答

元芳怎么了

不,没有办法避免。您调用的运算符接受 a&nbsp;bool?,而不是 a&nbsp;bool,因此参数必须是 a&nbsp;bool?,否则无法编译。有一个从boolto的隐式转换bool?,这可以从 convert 表达式中看出。如果没有那个隐式转换,它就不是一个有效的表达式。理论上,您可以手动构建自己的表达式,使用真正的可为空的布尔常量值,但无法使 lambda“自动”生成这样的表达式,并且尝试创建新表达式几乎肯定比简单地具有更多的工作您的查询提供程序处理转换表达式。

慕标5832272

老实说,我不喜欢布尔属性中的 Nullable ,更适合您的情况:Expression<Func<UserRight,&nbsp;bool>>&nbsp;expression&nbsp;=&nbsp;p&nbsp;=>&nbsp;p.Active&nbsp;??&nbsp;false这会将空值视为错误,并解决您的情况。
随时随地看视频慕课网APP
我要回答