Ich habe nur ein paar Webcasts gesehen, bevor ich mich mit dem Entwerfen einiger Entity Framework-Anwendungen befasst habe. Ich habe wirklich nicht so viel Dokumentation gelesen und ich habe das Gefühl, dass ich jetzt darunter leide.
Ich habe List<T>
in meinen Klassen verwendet, und es hat großartig funktioniert.
Jetzt habe ich einige Dokumentationen gelesen und es heißt, dass ich hätte verwenden sollen ICollection<T>
. Ich habe dies geändert und es hat nicht einmal eine Änderung des Modellkontexts verursacht. Liegt das daran, dass beide List<T>
und ICollection<T>
erben IEnumerable<T>
, und das ist es, was für EF tatsächlich erforderlich ist?
Wenn dies jedoch der Fall ist, warum wird in der EF-Dokumentation nicht angegeben, dass dies IEnumerable<T>
anstelle von erforderlich ist ICollection<T>
?
Gibt es auf jeden Fall Nachteile bei dem, was ich getan habe, oder sollte ich es ändern?
List<T>
muss jede dieser Schnittstellen (implementierenIList<T>
,ICollection<T>
,IEnumerable<T>
) wegen der Vererbungshierarchie. Zum Abschluss,IList<T>
nimmt auch die nicht-generic upIList
,ICollection
undIEnumerable
Schnittstellen.ICollection<T>
die Partei einlädt (und diese Schnittstelle bringt dies mit sichIEnumerable<T>
, also das "Normale" "Linq-Operationen sind noch gültig).Sie haben die Schnittstelle ausgewählt, die sie erstellt haben, da sie eine verständliche Abstraktion über die magischen Abfragen bietet, die das Entity Framework bei Verwendung von Linq ausführt.
Hier ist der Unterschied zwischen den Schnittstellen:
IEnumerable<T>
ist schreibgeschütztICollection<T>
List<T>
Von diesen
ICollection
undIEnumerable
gut auf Datenbankoperationen abzubilden, da das Abfragen und Hinzufügen / Entfernen von Entitäten Dinge sind, die Sie in einer Datenbank tun könnten.Der Direktzugriff nach Index wird nicht so gut zugeordnet, da für die Iteration ein vorhandenes Abfrageergebnis erforderlich wäre, da sonst bei jedem Direktzugriff die Datenbank erneut abgefragt würde. Wem würde der Index auch zugeordnet? Zeilennummer? Es gibt nicht viele Zeilennummernabfragen, die Sie ausführen möchten, und es ist überhaupt nicht hilfreich, größere Abfragen aufzubauen. Also unterstützen sie es einfach nicht.
ICollection<T>
wird unterstützt und ermöglicht es Ihnen, Daten sowohl abzufragen als auch zu ändern. Verwenden Sie diese Option.Der Grund
List<T>
dafür ist zunächst, dass die EF-Implementierung am Ende eine zurückgibt. Aber das ist am Ende Ihrer Abfragekette, nicht am Anfang. Wenn Sie also Ihre EigenschaftenICollection<T>
festlegen, wird deutlicher, dass der EF eine Reihe von SQL erstellt und erstList<T>
am Ende ein zurückgibt , anstatt Abfragen für jede von Ihnen verwendete Linq-Ebene durchzuführen.quelle
ICollection unterscheidet sich von IEnumerable darin, dass Sie der Sammlung tatsächlich Elemente hinzufügen können, während dies mit IEnumerable nicht möglich ist. In Ihren POCO-Klassen möchten Sie beispielsweise ICollection verwenden, wenn Sie zulassen möchten, dass die Sammlung hinzugefügt wird. Machen Sie die ICollection virtuell, um auch vom verzögerten Laden zu profitieren.
quelle
Obwohl die Frage vor Jahren gestellt wurde, ist sie immer noch gültig, wenn jemand nach demselben Szenario sucht.
Es gibt einen kürzlich erschienenen [2015] CodeProject-Artikel, in dem der Unterschied im Detail und in der grafischen Darstellung mit Beispielcode erläutert wird . Es ist nicht direkt auf EF ausgerichtet, hofft aber dennoch, dass es eine größere Hilfe sein wird:
Liste vs IEnumerable vs IQueryable vs ICollection vs IDictionary
quelle