我正在尝试为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)}
为了避免这种情况&#34;转换&#34;。 有一个简单的方法吗? 因为我的解析器已准备就绪,我不想因为可空字段而重建它。
答案 0 :(得分:4)
不,没有办法避免它。您正在调用的运算符接受bool?
而不是bool
,因此参数必须为bool?
,否则无法编译。存在从bool
到bool?
的隐式转换,并且可以从转换表达式中看到。如果没有隐式转换,它将不是有效的表达式。
理论上,您可以手动构建自己的表达式,该表达式使用真正可以为空的布尔值常量值,但是没有办法让lambda“自动”生成这样的表达式,并且尝试创建新表达式几乎可以肯定更多的工作而不仅仅是让您的查询提供程序处理转换表达式。
答案 1 :(得分:1)
老实说,我不喜欢布尔属性中的Nullable, 更适合您的情况:
Expression<Func<UserRight, bool>> expression = p => p.Active ?? false
这会将空值视为假,并会解决您的情况。
答案 2 :(得分:0)
当您使用可空变量时,您应该检查它是否有值,如果是,则访问该值。像这样的东西:
p=> p.Active.HasValue ? p.Active.Value : false; //'== true' unnecessary
或者
p=> p.Active.GetValueOrDefault(); //the same but shorter.
我不确定你的解析器是如何工作的,但我认为这可行。