我正在尝试将条件表达式放在lambda查询中,如下所示
GetPeers(bool? isConnected = true)
{
dbContext
.peers
.Where(m => isConnected.HasValue ? m.IsConnected == isConnected.Value : true)
.ToList();
}
上面的语句给了我Nullable object must have a value.
例外。
我不明白!我的查询有什么问题?
如果isConnected
为空,我想要的是它应该返回所有记录,否则将基于m.IsConnected == isConnected.Value
,
答案 0 :(得分:4)
这是实体框架如何翻译三元表达式的问题,它试图使用isConnected.Value
的结果创建SQL参数,但isConnected
为空,因此它会抛出。
我首选的选项是仅在实际存在要应用的谓词时应用谓词:
IQueryable<Peer> peers = dbContext.peers;
if(isConnected.HasValue)
{
var isConnectedValue = isConnected.Value;
peers = peers.Where(m => m.IsConnected == isConnectedValue);
}
return peers.ToList();
答案 1 :(得分:3)
你可以改变这个
m.IsConnected == isConnected.Value
到这个
m.IsConnected == (isConnected.HasValue && isConnected.Value)
问题在于isConnected
并不总是有值。这是一个bool?
。所以它可以有一个值(null
)。如果它有一个值,它将是true / false。当它没有价值时,问题就出现了。由于条件运算符,这种情况正在发生。根据文件:
条件运算符(?:)根据需要返回两个值中的一个 布尔表达式的值。以下是该语法 条件运算符。
条件? first_expression:second_expression;
要么 first_expression和second_expression 的类型必须是 相同,或隐式转化必须存在于一种类型。
有关完整文档,请查看here。