下の行がありますが、例外がまだ発生します "シーケンスに複数の要素が含まれています"
Details rd = this.db.Details.SingleOrDefault(x => x.TId == Id && x.TypeId == TypeId);
SingleOrDefaultが例外を回避することを望んでいました。
SingleOrDefault
は[〜#〜] single [〜#〜]要素を返します。要素が見つからない場合はnullを返します。 Enumerableで2つの要素が見つかった場合、表示されている例外がスローされます。ハイランダーのように...シングルで-1つしか存在できません。
FirstOrDefault
は、見つかった[〜#〜] first [〜#〜]要素を返します。要素が見つからない場合はnullを返します。そのため、述部に一致する要素が2つある場合、2番目の要素は無視されます。
複数の一致があるかどうかは気にせず、最初の一致のみが必要であるか、一致が見つからない場合はnullであると仮定すると...
Details rd = this.db.Details
.FirstOrDefault(x => x.TId == Id && x.TypeId == TypeId);
これらのメソッドはどちらも1つの要素のみを返すことに注意してください。一致するものが見つかった後の動作が異なるだけです。 First
はそのポイントの検索を停止し、見つかったものを返します。Single
はリストの残りの部分をチェックし、一致するものがないことを確認します。 OrDefault
部分は、一致が見つからない場合に返すものを決定します。 SingleOrDefault
またはFirstOrDefault
は、値が見つからない場合にnullを返しますが、Single
またはFirst
を使用する場合、一致するものを1つ見つける必要があります。そうしないと例外がスローされます。 。
編集:Good point SteveFirst
は最初の要素を返すため、必要な要素が実際に最初であることを確認するためにOrderBy
を使用する必要がある場合があります。たとえば...オブジェクトにUpdateDateプロパティがあり、最新のUpdateDateを持つオブジェクトが必要だとします...
Details rd = this.db.Details
.OrderByDescending(x => x.UpdateDate)
.FirstOrDefault(x => x.TId == Id && x.TypeId == TypeId);
リストがある場合は、リストをIEnumerableリストに変換してから、FirstOrDefaultメソッドを使用できます。
IEnumerable<BuyOnlineSearchdetails> details = new List<BuyOnlineSearchdetails>();
var FirstRow = details.FirstOrDefault();
string Count = "0";
if (FirstRow != null)
{
Count = FirstRow.TotalCount.ToString();
}
else
{
Count = "0";
}