Null Dapper.net查询仍然使用FirstOrDefault()

时间:2016-10-25 11:51:58

标签: c# linq dapper

我想使用Dapper.net

从表中返回最大ID
var x = connection.Query<int>("SELECT max(val) FROM info").FirstOrDefault();

这有效 - 除非不存在行,否则我会得到

  

对象引用未设置为对象的实例。

不应该是OrDefault&#39;是否在没有记录时返回0?

如何返回0 - 或某些非空值以防止崩溃。

THX

2 个答案:

答案 0 :(得分:9)

问题在于,您告诉Dapper期望int序列,但实际上您有null值的可能性。所以你要么需要改变类型

var x = connection.Query<int?>("SELECT max(val) FROM info").Single() ?? 0;

或者您需要更改查询以处理null

var x = connection.Query<int>("SELECT COALESCE(max(val), 0) FROM info").Single();

我在这里使用Single因为此查询应该只返回一行。

当您期望序列并且只想要第一个项目时,或者如果没有项目您想要项目类型的默认值时,您将使用FirstOrDefault

答案 1 :(得分:2)

var x = connection.Query<int>("SELECT ISNULL(max(val), 0) FROM info").Single();

如果要在值为null时选择默认值,则可以使用ISNULL。