1. ホーム
  2. .net

[解決済み] LINQ: フィルタリング基準で SingleOrDefault と FirstOrDefault() を使用する場合

2022-03-01 17:35:48

質問

IEnumerableの拡張メソッドについて考えてみましょう。 SingleOrDefault()FirstOrDefault()

というMSDNドキュメント SingleOrDefault :

シーケンス内の唯一の要素、あるいはシーケンスが空の場合はデフォルト値を返します。シーケンス内に複数の要素がある場合は、このメソッドは例外をスローします。

一方 FirstOrDefault MSDNより (を使用する場合(おそらく OrderBy() または OrderByDescending() または全くない)。

シーケンスの最初の要素を返します。

いくつかのクエリ例を見てみると、この2つのメソッドをいつ使えばいいのか、必ずしも明確ではありません。

var someCust = db.Customers
.SingleOrDefault(c=>c.ID == 5); //unlikely(?) to be more than one, but technically COULD BE

var bobbyCust = db.Customers
.FirstOrDefault(c=>c.FirstName == "Bobby"); //clearly could be one or many, so use First?

var latestCust = db.Customers
.OrderByDescending(x=> x.CreatedOn)
.FirstOrDefault();//Single or First, or does it matter?

質問

どのような規約に従っていますか、または推奨していますか を使用することを決定するとき SingleOrDefault()FirstOrDefault() をLINQクエリで使用することはできますか?

どのように解決するのですか?

を使用する場合は、必ず SingleOrDefault を返すと明記しています。 シングル の結果が得られます。一方 FirstOrDefault を使用すると、クエリは任意の数の結果を返すことができますが、最初の1つだけが必要であることを指定します。

個人的にはセマンティクスが大きく異なるので、期待する結果に応じて適切な方を使うことで、可読性が向上すると思います。