Entity Framework의 ICollection <T> 대 List <T>


114

몇 가지 Entity Framework 응용 프로그램을 디자인하기 전에 웹 캐스트를 몇 개만 봤습니다. 나는 그다지 많은 문서를 읽지 않았고 지금 고통 받고 있다고 느낍니다.

나는 List<T>수업에서 사용하고 있으며 훌륭하게 작동했습니다.

이제 몇 가지 문서를 읽었으며 ICollection<T>. 나는 이것으로 변경했고 모델 컨텍스트 변경도 일으키지 않았습니다. 둘 다 List<T>ICollection<T>상속 때문입니까, 이것이 IEnumerable<T>실제로 EF에 필요한 것입니까?

이 경우 그러나, 왜 요구하는 EF 문서 상태하지 않는 IEnumerable<T>대신 ICollection<T>?

어쨌든 내가 한 일에 단점이 있습니까? 아니면 변경해야합니까?

답변:


113

Entity Framework는 인터페이스의 일부가 아닌 작업 ICollection<T>을 지원해야하기 때문에 사용 Add합니다 IEnumerable<T>.

또한 사용 ICollection<T>하고 있었으며 단순히 List<T>구현 으로 노출 한 것 입니다. List<T>그와 함께 제공 IList<T>, ICollection<T>IEnumerable<T>.

변경 사항은 List<T>작동 하더라도 인터페이스를 통해 노출하는 것이 좋은 선택 입니다. 인터페이스는 계약을 정의하지만 구현은 정의하지 않습니다. 구현 변경 될 수 있습니다. 경우에 따라 구현은 HashSet<T>예를 들어. (이것은 Entity Framework 이상에서 사용할 수있는 사고 방식입니다. 좋은 개체 지향 관행은 구현이 아닌 인터페이스를 대상으로 프로그래밍하는 것입니다. 구현은 변경 될 수 있으며 변경 될 것입니다.)


2
그래서 .... 조금 더 이해하기 위해-List는 IList를 상속하고 IEnumerable을 상속하는 ICollection을 상속합니까?
2011 년

3
예, 그게 사슬입니다. List<T>이러한 인터페이스 (각각 구현하는 IList<T>, ICollection<T>, IEnumerable<T>인해 계승 계층을). 완료를 위해, IList<T>또한 제네릭이 아닌 픽업 IList, ICollectionIEnumerable인터페이스를.
안토니 Pegram

감사합니다 ... Ixxx 기능 중 일부는 여전히 내 이해에서 벗어날 수 있습니다! 그러나 마지막으로 나를 짜증나게하는 한 가지를 이해했습니다. 다른 Ixx가 IEnumerable을 상속하는 경우 Ienumerable이 읽기 전용 인 경우 IEnumerable에 어떻게 추가됩니까? ... 너무 복잡해도 걱정하지 마세요. 시간이 있으면 반사판을 켜 보겠습니다!
wil

10
일반적인 Linq 작업은 항목을 추가하거나 변경하지 않으며 단순히 필터링, 그룹화, 프로젝트 등을 수행합니다. 순방향 전용, 읽기 전용 시퀀스는 이러한 작업을 지원하는 데 필요한 모든 것입니다. 당신은 엔티티 프레임 워크로의 LINQ 공급자가있는 경우 데이터 지속성과 거래, 추가 할 수있는 기능은 무엇 초대하는 beefier에 인터페이스를 필요로하는 실질적인 혜택입니다 ICollection<T>파티에 (그리고이 인터페이스는 함께 제공합니다 IEnumerable<T>"정상적인 있도록, "Linq 작업은 여전히 ​​유효합니다.)
Anthony Pegram

@AnthonyPegram : 세 가지 인터페이스를 모두 구현해야한다고 말하는 것은 완전히 잘못된 것 같습니다. IList <T>는 IEnumerable <T>를 상속하는 ICollection <T>를 상속하므로 List <T>가 IList <T>를 간단히 구현하는 것으로 충분합니다.
CJ7 2011

51

그들은 Linq를 사용할 때 Entity Framework가 수행하는 매직 쿼리에 대해 이해할 수있는 추상화를 제공하기 때문에 그들이 한 인터페이스를 선택했습니다.

인터페이스 간의 차이점은 다음과 같습니다.

  • IEnumerable<T> 읽기 전용
  • 항목을 추가 및 제거 할 수 있습니다. ICollection<T>
  • (인덱스로) 임의 액세스를 수행 할 수 있습니다. List<T>

그 중 ICollection과하는 IEnumerable쿼리 및 추가 이후, 데이터베이스 작업에 잘지도 / 제거 엔티티를 사용하면 DB에서 할 수있는 일이 있습니다.

반복 할 기존 쿼리 결과가 있어야하거나 각 임의 액세스가 데이터베이스를 다시 쿼리해야하므로 인덱스 별 임의 액세스도 매핑되지 않습니다. 또한 인덱스는 무엇에 매핑됩니까? 행 번호? 수행하려는 행 번호 쿼리가 많지 않으며 더 큰 쿼리를 작성하는 데 전혀 유용하지 않습니다. 그래서 그들은 단순히 그것을 지원하지 않습니다.

ICollection<T> 지원되며 데이터를 쿼리하고 변경할 수 있으므로 사용하십시오.

그 이유는 List<T>것입니다로 시작하는 작동 EF 구현 끝나기 때문에 결국 하나를 반환까지. 그러나 그것은 시작이 아니라 쿼리 체인의 끝입니다. 따라서 속성 ICollection<T>을 만들면 List<T>사용하는 Linq의 각 수준에 대해 쿼리를 수행하는 대신 EF가 SQL 무리를 만들고 끝에 a 만 반환한다는 것이 더 분명해집니다 .


8

ICollection은 실제로 컬렉션에 항목을 추가 할 수 있다는 점에서 IEnumerable과 다릅니다. 반면 IEnumerable에서는 그렇게 할 수 없습니다. 예를 들어 POCO 클래스에서 컬렉션을 추가 할 수 있도록하려면 ICollection을 사용하려고합니다. 지연 로딩의 이점을 얻으려면 ICollection을 가상으로 만드십시오.


1
이해하고 싶습니다. List <T>로 동일한 작업을 수행 할 수 있습니다. 왜 ICollection <T>입니까? List <T>는 어떻습니까? 더 간단하고 강력 해 보입니다.
monstro

List <T> ICollection 및 IEnumerable을 구현합니다. 더 많은 작업을 수행하지만 더 많은 오버 헤드가 발생합니다.
IronAces

4

질문이 몇 년 전에 게시되었지만 누군가 동일한 시나리오를 찾고있을 때 여전히 유효합니다.

최근 [2015] CodeProject 기사는 샘플 코드를 사용 하여 훨씬 자세하게 차이점과 그래픽 표현을 설명합니다 . EF에 직접 초점을 맞추지는 않았지만 여전히 더 큰 도움이되기를 바랍니다.

목록 대 IEnumerable 대 IQueryable 대 ICollection 대 ​​IDictionary

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.