IEnumerable拡張メソッドを検討しSingleOrDefault()
、FirstOrDefault()
シーケンスの唯一の要素を返します。シーケンスが空の場合はデフォルト値を返します。シーケンスに複数の要素がある場合、このメソッドは例外をスローします。
一方FirstOrDefault
MSDNより(おそらく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