Entity Framework'te ICollection <T> Vs List <T>


116

Birkaç Entity Framework uygulaması tasarlamaya başlamadan önce yalnızca birkaç web yayını izledim. Gerçekten o kadar çok belge okumadım ve şimdi bunun için acı çekiyormuşum gibi hissediyorum.

List<T>Derslerimde kullanıyorum ve harika çalıştı.

Şimdi bazı belgeleri okudum ve kullanmam gerektiğini söylüyor ICollection<T>. Buna geçtim ve model bağlamında değişikliğe bile neden olmadı. Bu hem çünkü mı List<T>ve ICollection<T>inherit IEnumerable<T>ve aslında EF için ne gereklidir ki?

Ancak, durum buysa, neden EF belgeleri IEnumerable<T>bunun yerine bunun gerekli olduğunu belirtmiyor ICollection<T>?

Her halükarda, yaptıklarımın herhangi bir dezavantajı var mı, yoksa onu değiştirmeli miyim?

Yanıtlar:


114

Entity Framework , arabirimin parçası olmayan işlemleri ICollection<T>desteklemesi gerektiği için kullanır.AddIEnumerable<T>

Ayrıca unutmayın edildi kullanarak ICollection<T>, sen sadece olduğunu açığa alındı List<T>uygulanması. List<T>onunla birlikte getiriyor IList<T>, ICollection<T>ve IEnumerable<T>.

Değişikliğinize gelince, List<T>çalışmaya rağmen arayüz aracılığıyla ifşa etmek iyi bir seçimdir . Arayüz sözleşmeyi tanımlar ancak uygulamayı tanımlamaz. Uygulama olabilir değiştirin. Bazı durumlarda, belki uygulama HashSet<T>örneğin bir olabilir . (Bu arada bu, Entity Framework'ten daha fazlası için kullanabileceğiniz bir zihniyettir. Nesne odaklı iyi bir uygulama, uygulamaya değil arayüze yönelik programlamadır. Uygulamalar değişebilir ve değişecektir.)


2
Yani .... biraz daha anlayabilmem için - List, IEnumerable'ı miras alan ICollection'ı miras alan IList'i miras alır?
Wil

3
Evet, zincir bu. List<T>o arayüzler (her uygulamak zorundadır IList<T>, ICollection<T>, IEnumerable<T>çünkü miras hiyerarşisinin). Tamamlanması için, IList<T>ayrıca sigara jenerik alır IList, ICollectionve IEnumerablearayüzleri.
Anthony Pegram

Teşekkürler ... Ixxx özelliklerinden bazıları hala anlayışımdan kaçıyor! Bununla birlikte, beni rahatsız eden son bir şeyi mantıklı buldunuz, eğer diğer Ixx'in Ixx'in mirası IEnumerable ise, bir Ienumerable salt okunursa, bu IEnumerable'a nasıl eklenir? ... Çok karmaşıksa endişelenme, biraz zamanım olduğunda reflektörü ateşlemeye çalışacağım!
Wil

10
Normal Linq işlemleri bir şeyler ekleme veya değiştirme yapmaz, bunlar sadece filtreler, gruplandırır, projelendirir, vb. Bu işlemleri desteklemek için sadece ileri, salt okunur diziler gereklidir. Veri kalıcılığı ile ilgilenen Entity Framework gibi bir Linq sağlayıcınız olduğunda, Ekleme yeteneği ICollection<T>, partiyi davet eden daha güçlü bir arayüz gerektiren önemli bir avantajdır (ve bu arayüz bununla birlikte gelir IEnumerable<T>, bu nedenle "normal "Linq işlemleri hala geçerlidir).
Anthony Pegram

@AnthonyPegram: Üç arayüzün de uygulanması gerektiğini söylemenin kesinlikle yanlış olduğunu düşünüyorum. IList <T>, IEnumerable <T> 'yi miras alan ICollection <T>' yi miras aldığından, List <T> 'nin IList <T>' yi basitçe uygulaması yeterlidir.
CJ7

51

Yaptıkları arabirimi seçtiler çünkü Linq'i kullandığınızda Entity Framework'ün gerçekleştirdiği sihirli sorgular üzerinde anlaşılır bir soyutlama sağlıyor.

Arayüzler arasındaki fark şu şekildedir:

  • IEnumerable<T> salt okunur
  • Öğeleri bir ICollection<T>
  • Rasgele erişim (indekse göre) yapabilirsiniz. List<T>

Bunların dışında ICollection ve IEnumerableveritabanı işlemleriyle iyi bir şekilde eşleştirin, çünkü varlıkları sorgulamak ve eklemek / kaldırmak bir DB'de yapabileceğiniz şeylerdir.

Dizine göre rastgele erişim de eşleşmez, çünkü üzerinde yineleme yapmak için mevcut bir sorgu sonucuna sahip olmanız gerekir veya her rastgele erişim veritabanını yeniden sorgulayabilir. Ayrıca, indeks eşlemesi ne olacak? Satır numarası? Yapmak isteyeceğiniz çok sayıda satır numarası sorgusu yoktur ve daha büyük sorgular oluşturmak için hiç de yararlı değildir. Yani bunu desteklemiyorlar.

ICollection<T> desteklenir ve verileri hem sorgulamanıza hem de değiştirmenize izin verir, bu yüzden onu kullanın.

Sebebi List<T>ise başlamak için çalışır EF uygulama uçları çünkü sonunda bir tane dönen kadar. Ancak bu, sorgu zincirinizin başında değil, sonundadır. Bu nedenle, özelliklerinizi ICollection<T>oluşturmak, EF'nin bir grup SQL oluşturduğunu ve List<T>kullandığınız her Linq düzeyi için sorgu yapmak yerine yalnızca sonunda a döndürdüğünü daha açık hale getirecektir .


8

ICollection, koleksiyona gerçekten öğe ekleyebilmeniz açısından IEnumerable'dan farklıdır, oysa IEnumerable ile yapamazsınız. Dolayısıyla, örneğin POCO sınıflarınızda, koleksiyonun eklenmesine izin vermek istiyorsanız, ICollection kullanmak istersiniz. Geç yüklemeden de yararlanmak için ICollection sanal hale getirin.


1
Anlamak istiyorum - List <T> ile aynı işlemleri (ve daha fazlasını!) Yapabilirsiniz. Neden ICollection <T>? Neden List <T> değil? Daha basit ve daha güçlü görünüyor.
monstro

List <T> ICollection ve IEnumerable'ı uygular. Daha fazla işlem, ancak bununla birlikte daha fazla yük getirir.
IronAces

4

Soru yıllar önce yayınlanmış olsa da, birisi aynı senaryoyu ararken hala geçerlidir.

Örnek kodla farkı çok ayrıntılı ve grafiksel gösterimlerle açıklayan yeni bir [2015] CodeProject makalesi var . Doğrudan EF'e odaklanmadı, ancak yine de daha fazla yardımcı olacağını umuyoruz:

List - IEnumerable - IQueryable - ICollection - IDictionary

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.