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