LINQ: フィルタリング基準で SingleOrDefault と FirstOrDefault() を使用する場合の適切なタイミング 質問する

LINQ: フィルタリング基準で SingleOrDefault と FirstOrDefault() を使用する場合の適切なタイミング 質問する

IEnumerable拡張メソッドを検討しSingleOrDefault()FirstOrDefault()

MSDNのドキュメントSingleOrDefault:

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

一方FirstOrDefaultMSDNより(おそらくOrderBy()orOrderByDescending()または none を使用する場合)、

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

いくつかのクエリ例を検討してみてください。これらの 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?

質問

LINQ クエリでおよびSingleOrDefault()を使用することを決定するときに、どのような規則に従うか、または提案しますか?FirstOrDefault()

ベストアンサー1

結果セットが 0 件のレコードを返す場合:

  • SingleOrDefault型のデフォルト値を返します(例:intのデフォルトは0)
  • FirstOrDefault型のデフォルト値を返します

結果セットが 1 つのレコードを返す場合:

  • SingleOrDefaultそのレコードを返す
  • FirstOrDefaultそのレコードを返す

結果セットが多数のレコードを返す場合:

  • SingleOrDefault例外をスローする
  • FirstOrDefault最初のレコードを返す

結論:

結果セットに多数のレコードが含まれている場合に例外をスローする場合は、 を使用しますSingleOrDefault

結果セットに何が含まれていても常に1つのレコードが必要な場合は、FirstOrDefault

おすすめ記事