データにProjectIdのレコードがない場合、SQLServerはnullを返します。
Data
一致するレコードがない場合、SQLサーバーは実際にはnullを返しません-行を返しません。このシナリオは正常に機能します。
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
は、別のシナリオ、つまり「行を返した」シナリオについて話していることを意味します。そのため、コードが言っているのは、「nullを含むこの1つ以上の整数を取得し、null不可能なintとしてマップする」ということです。これは不可能であり、マッパーは正しくスローします。例外。代わりに、必要なものは次のとおりです。
int? result = connection.Query<int?>(...).SingleOrDefault();
ここで、行がある場合は、値をにマッピングしてからint?
、single-or-defaultを適用します。それをintとして必要な場合は、次のようにします。
int result = connection.Query<int?>(...).SingleOrDefault() ?? 0;
「ゼロ行」と「null結果」の違いを区別できるようにする必要がある場合は、次のことをお勧めします。
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
}
または同様のもの