いくつかのレガシー コードを確認していて、不要な例外をスローするように見えるスニペットに出会いました。基本的に、コード (EntityFramework クエリ) は次のようになります。
var serviceId = (Guid?) person.Services.FirstOrDefault(s => s.Name == "foo").Id;
bool inService = serviceId.HasValue;
つまり、 にperson
は複数のサービスが割り当てられており、 が である最初のサービスを返していName
ますfoo
。次に、そのインスタンスの Id プロパティ (Guid) を取得Service
し、null 許容の Guid にキャストします。最後に、その null 許容 Guid に値がある場合、その人物はそのサービスに属している必要があります。
(注:これは私が上記を書くことを選択する方法ではありません。それは私が取り組んでいるものです)
呼び出しがインスタンスFirstOrDefault
を返し、プロパティにアクセスすると単にスローされるため、このコードは、その人が「foo」という名前のサービス(または実際にはまったくサービス)に属していない場合に例外をスローするだけだと感じています。 NPE。null
Service
Id
このスニペットについて元の開発者に尋ねたところ、次のことを行うように言われました。
(T?) entity.<non-existent entity>.SomeProperty
NPE をスローする代わりに、単に null オブジェクトを返します。また、この種の "安全な null 処理" は、Entity Framework クエリでも発生します。
これは信じられないほど直観に反しているように思えますし、それが可能であるとは思えません。これについて調べてみましたが、それらの線に沿ったものは見つかりませんでした。誰もこれについて経験がありますか?自分が間違っていることを知り、何か新しいことを学べたことは 100% うれしいのですが、それが正しいとは思えません。
補遺として、EntityFramework接続を使用してLinqpadで上記のクエリを実行しようとしましたが、nullオブジェクトプロパティにアクセスしようとすると実際にNPEを生成しました