wake-up-neo.com

Sequenz enthält mehr als ein Element - SingleOrDefault hilft nicht

Ich habe die folgende Zeile, bekomme aber immer noch eine Ausnahme " Sequenz enthält mehr als ein Element "

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

Ich hatte gehofft, dass SingleOrDefault die Ausnahme vermeiden würde.

15
StackTrace

SingleOrDefault gibt einSINGLE-Element zurück oder null, wenn kein Element gefunden wird. Wenn sich in Ihrem Enumerable 2 Elemente befinden, wird die Ausnahme ausgelöst, die Sie sehen. Genau wie Highlander ... mit Single - es kann nur einen geben.

FirstOrDefault gibt das gefundene ElementFIRSTzurück oder null, wenn kein Element gefunden wird. Wenn also zwei Elemente mit Ihrem Prädikat übereinstimmen, wird das zweite Element ignoriert.

Angenommen, es ist Ihnen egal, ob es mehrere Übereinstimmungen gibt und Sie nur die erste oder null verwenden möchten, wenn keine Übereinstimmung gefunden wird ... dann möchten Sie wahrscheinlich Folgendes:.

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

Beachten Sie, dass beide Methoden nur ein Element zurückgeben. Sie unterscheiden sich nur in dem, was sie tun, nachdem sie eine Übereinstimmung gefunden haben. First hört auf, an diesem Punkt zu suchen, und gibt zurück, was gefunden wurde. Single überprüft den Rest der Liste, um sicherzustellen, dass keine weiteren Übereinstimmungen vorhanden sind. Der OrDefault-Teil bestimmt, was er zurückgibt, wenn keine Übereinstimmung gefunden wird. SingleOrDefault oder FirstOrDefault gibt null zurück, wenn kein Wert gefunden wird. Wenn Sie jedoch nur Single oder First verwenden, MUSS es eine Übereinstimmung finden, da sonst eine Ausnahme ausgelöst wird.

EDIT: Good point Steve Da First das erste Element zurückgibt, müssen Sie möglicherweise eine OrderBy verwenden, um sicherzustellen, dass das gewünschte Element tatsächlich das erste ist. Angenommen, Ihr Objekt hatte eine UpdateDate-Eigenschaft und Sie wollten das Objekt mit dem neuesten UpdateDate ...

Details rd = this.db.Details
    .OrderByDescending(x => x.UpdateDate)
    .FirstOrDefault(x => x.TId == Id && x.TypeId == TypeId);
31
Kevin

Falls Sie über eine Liste verfügen, konvertieren Sie die Liste in eine IEnumerable-Liste. Anschließend können Sie die FirstOrDefault-Methode verwenden

 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