SingleOrDefault
gibt SINGLE Element oder null zurück, wenn kein Element gefunden wird. Wenn 2 Elemente in Ihrer Enumerable gefunden werden, wird die Ausnahme ausgelöst, die Sie sehen. Genau wie Highlander ... mit Single - es kann nur einen geben.
liefert das FIRST Element, das es findet, oder null, wenn kein Element gefunden wird. Wenn also zwei Elemente mit Ihrem Prädikat übereinstimmen, wird der zweite ignoriert.
Sie Unter der Annahme, egal, ob es mehrere Übereinstimmungen sind und Sie wollen nur die erste oder null, wenn keine Übereinstimmung gefunden wird ... dann wollen Sie wahrscheinlich die folgenden ...
Details rd = this.db.Details
.FirstOrDefault(x => x.TId == Id && x.TypeId == TypeId);
Beachten Sie, dass Beide Methoden geben nur ein Element zurück, das sich nur dadurch unterscheidet, was sie tun, nachdem sie eine Übereinstimmung gefunden haben. First
stoppt den Blick auf diesen Punkt und gibt zurück, was es gefunden hat, überprüft Single
den Rest der Liste, um sicherzustellen, dass es keine Übereinstimmungen mehr gibt. Der OrDefault
Teil bestimmt, was zurückgegeben wird, wenn keine Übereinstimmung gefunden wird. SingleOrDefault
oder FirstOrDefault
gibt null zurück, wenn kein Wert gefunden wird, aber wenn Sie einfach Single
oder First
verwenden, dann MUSS es eine Übereinstimmung finden oder es wird eine Ausnahme ausgelöst.
EDIT: Guter Punkt Steve Seit First
kehrt das erste Element, das Sie eine OrderBy
verwenden, um brauchen kann das Element Sie wollen sicherstellen, dass zuerst in der Tat ist. Zum Beispiel ... Angenommen, Ihr Objekt hatte eine UpdateDate Eigenschaft und Sie das Objekt mit der neuesten UpdateDate wollten ...
Details rd = this.db.Details
.OrderByDescending(x => x.UpdateDate)
.FirstOrDefault(x => x.TId == Id && x.TypeId == TypeId);
FirstOrDefault? – Steve