web-dev-qa-db-ja.com

シーケンスに複数の要素が含まれています-SingleOrDefaultは役立ちません

下の行がありますが、例外がまだ発生します "シーケンスに複数の要素が含まれています"

Details rd = this.db.Details.SingleOrDefault(x => x.TId == Id && x.TypeId == TypeId);

SingleOrDefaultが例外を回避することを望んでいました。

21
StackTrace

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);
38
Kevin

リストがある場合は、リストを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";
            }
0
Arun Prasad E S