次のようなラムダでデータベースからデータを取得します
var obj = DBContext.MyTable.Where(x => x.ID == 2).SingleOrDefault().MyColumn;
実は にMyTable
2 の ID はありません。
だから私はこのメッセージを受け取りました。
オブジェクト参照がオブジェクト インスタンスに設定されていません。
どうすれば適切に検証できますか?
クエリの結果を別の変数にキャプチャし、プロパティにアクセスする前にアイテムが見つかったかどうかを確認します。
var yourItem = DBContext.MyTable.Where(x => x.ID == 2).SingleOrDefault();
if (yourItem != null)
obj = yourItem.MyColumn;
SingleOrDefault
ところで、述語をメソッドに渡すことができます:
var yourItem = DBContext.MyTable.SingleOrDefault(x => x.ID == 2);
また、お申し込み前に物件をお選びいただけますSingleOrDefault
var obj = DBContext.MyTable.Where(x => x.ID == 2)
.Select(x => x.MyColumn)
.SingleOrDefault();
これを行う別の方法は、最初の引数が null の場合に 2 番目の引数を使用する"null-coalescing" ??
operatorを使用することです。
var obj = (DBContext.MyTable.FirstOrDefault(x => x.ID == 2) ?? new MyTable()).MyColumn;
戻り値が null かどうかを最初に確認してからアクセスする必要があります。
var temp = DBContext.MyTable.Where(x => x.ID == 2).SingleOrDefault();
if (temp != null)
{
var obj = temp.MyColumn;
}
最もエレガントな方法ではありませんが、他に知りません。
.FirstOrDefault() の代わりに DefaultIfEmpty() を好む
そうすることで if チェックを避けることができます
例えば
var obj = DBContext.MyTable.Where(x => x.ID == 2).DefaultIfEmpty().MyColumn;
また
var obj = DBContext.MyTable.Where(x => x.ID == 2).DefaultIfEmpty(string.Empty).MyColumn;
DefaultIfEmpty の概念は単純です。空のコレクションを 1 つの既定値のコレクションに置き換えます。
int のデフォルト値は 0 です。したがって、List の DefaultIfEmpty は、ゼロ要素が 1 つある List を生成します。
それが役に立てば幸い。
var yourItem = DBContext.MyTable.Where(x => x.ID == 2).ToArray()
if( yourItem.Length > 0)
//do stuff