1

いくつかのレガシー コードを確認していて、不要な例外をスローするように見えるスニペットに出会いました。基本的に、コード (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 ServiceId

このスニペットについて元の開発者に尋ねたところ、次のことを行うように言われました。

(T?) entity.<non-existent entity>.SomeProperty

NPE をスローする代わりに、単に null オブジェクトを返します。また、この種の "安全な null 処理" は、Entity Framework クエリでも発生します。

これは信じられないほど直観に反しているように思えますし、それが可能であるとは思えません。これについて調べてみましたが、それらの線に沿ったものは見つかりませんでした。誰もこれについて経験がありますか?自分が間違っていることを知り、何か新しいことを学べたことは 100% うれしいのですが、それが正しいとは思えません。

補遺として、EntityFramework接続を使用してLinqpadで上記のクエリを実行しようとしましたが、nullオブジェクトプロパティにアクセスしようとすると実際にNPEを生成しました

4

1 に答える 1

1

FirstOrDefaultオブジェクトを返しnullます。EntityFramework は、エンティティの複合型であるすべてのプロパティが ではないことを確認しますが、そのクエリの結果をnull返します。null

于 2013-10-16T21:02:10.263 に答える