在數據不具有任何專案編號記錄的情況下,SQL Server返回NULL。
在Data
沒有任何匹配記錄的情況下,SQL服務器並不真正返回空 - 它不返回任何行。這種情況下工作正常:
var result = connection.Query<int>(// case with rows
"select DATEDIFF(day, GETUTCDATE(), @date)", new { date = DateTime.UtcNow.AddDays(20) })
.SingleOrDefault();
result.IsEqualTo(20);
result = connection.Query<int>(// case without rows
"select DATEDIFF(day, GETUTCDATE(), @date) where 1 = 0", new { date = DateTime.UtcNow.AddDays(20) })
.SingleOrDefault();
result.IsEqualTo(0); // zero rows; default of int over zero rows is zero
這兩個工作正常。您說ISNULL
「修復」這一事實意味着您正在討論不同的場景 - 「我返回的行」場景。既然如此,你的代碼所說的是「把這個1或更多的整數包含一個null,並將它映射爲一個不可爲空的int」 - 是不可能的,並且映射器是正確的拋出異常。相反,你想要的是:
int? result = connection.Query<int?>(...).SingleOrDefault();
現在,如果有行,它的值映射到int?
,並然後申請單或默認。你想要的是一個int,那麼也許:
int result = connection.Query<int?>(...).SingleOrDefault() ?? 0;
如果你需要能夠告訴「零排」和「零結果」之間的區別,那麼我建議:
class NameMe {
public int? Value {get;set;}
}
var row = connection.Query<NameMe>("select ... as [Value] ...", ...)
.SingleOrDefault();
if(row == null) {
// no rows
} else if(row.Value == null) {
// one row, null value
} else {
// one row, non-null value
}
或類似的東西
你也可以使用c#'? 0'合併操作員以在零的情況下提供零。 http://weblogs.asp.net/scottgu/archive/2007/09/20/the-new-c-null-coalescing-operator-and-using-it-with-linq.aspx – RThomas
我可以檢查:你是否談論您返回零行的情況?或者一個行返回null的情況? –
@MarcGravell返回的行爲null的情況。不是零行。 – ashes999