lambda表达式C#中的三元运算符

时间:2016-01-25 19:09:43

标签: c# entity-framework

我正在尝试将条件表达式放在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

2 个答案:

答案 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