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.
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);
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";
}