環境
C# 12.0
.NET 8.0.4
Dapper 2.1.35
Visual Studio 2022 (17.9.6)
ある日エラーが発生する
ある日を境にAPIが500 Internal Server Errorを返すようになりました。
出力されているエラーメッセージを見ると
sequence contains no elements
「シーケンスに要素が含まれていない」と怒られています。
原因は?
QueryFirst<T>
を使って1件だけ取得していた部分で
InvalidOperationException
上記の例外を送出していたことでした。
QueryFirst<T>
の仕様を詳しく見てみると、
- 取得したデータが1件以上あるときは先頭のデータをT型にマッピングして返す
-
データが0件の場合は
InvalidOperationException
例外を送出する
ということでした。
データが0件だったため例外を送出していたということです。
どうやって修正するか
方法1:取得データが0件であることが仕様として正しい場合
QueryFirstOrDefaultAsync<T>
を使う。
QueryFirstOrDefaultAsync<T>
は取得できたデータが0件の場合、nullが返ってくる。
そのため、nullデータを適切に処理すればOK
方法2:取得データが0件であることが仕様として間違っている場合
例外処理をする
catch( InvalidOperationException ex)
で例外を受け取って適切な処理をする
まとめ
データを1件だけ取得したいけど、0件の時もある場合は QueryFirstOrDefaultAsync<T>
を使おう
そして仕様はちゃんと確認しよう(戒め)
参考文献