Eu assisti apenas alguns webcasts antes de começar a projetar alguns aplicativos do Entity Framework. Eu realmente não li muita documentação e sinto que estou sofrendo por isso agora.
Tenho usado List<T>
em minhas aulas e tem funcionado muito bem.
Agora eu li alguma documentação e ela afirma que eu deveria estar usando ICollection<T>
. Eu mudei para isso, e nem mesmo causou uma mudança no contexto do modelo. É porque ambos List<T>
e ICollection<T>
herdam IEnumerable<T>
, e isso é o que é realmente necessário para EF?
No entanto, se for esse o caso, por que a documentação da EF não afirma que é necessário em IEnumerable<T>
vez de ICollection<T>
?
Em qualquer caso, há alguma desvantagem no que fiz ou devo mudá-lo?
List<T>
tem de implementar cada uma dessas interfaces (IList<T>
,ICollection<T>
,IEnumerable<T>
) por causa da hierarquia de herança. Para completar,IList<T>
também pega os não-genéricosIList
,ICollection
eIEnumerable
interfaces.ICollection<T>
à festa (e essa interface traz consigoIEnumerable<T>
, então o "normal "As operações do Linq ainda são válidas).Eles escolheram a interface que escolheram porque ela oferece uma abstração compreensível sobre as consultas mágicas que o Entity Framework realiza quando você usa o Linq.
Aqui está a diferença entre as interfaces:
IEnumerable<T>
é somente leituraICollection<T>
List<T>
Destes,
ICollection
eIEnumerable
mapear bem para operações de banco de dados, uma vez que consultar e adicionar / remover entidades são coisas que você pode fazer em um banco de dados.O acesso aleatório por índice não mapeia tão bem, já que você teria que ter um resultado de consulta existente para iterar, ou cada acesso aleatório consultaria o banco de dados novamente. Além disso, o que o índice mapearia? Número da linha? Não há muitas consultas de número de linha que você gostaria de fazer e não é de forma alguma útil na construção de consultas maiores. Então, eles simplesmente não apóiam isso.
ICollection<T>
é compatível e permitirá que você consulte e altere dados, então use isso.O motivo pelo qual
List<T>
funciona para começar é porque a implementação do EF acaba retornando um no final. Mas isso está no final de sua cadeia de consultas, não no início. Portanto, fazer suas propriedadesICollection<T>
tornará mais óbvio que o EF cria um monte de SQL e só retorna aList<T>
no final, em vez de fazer consultas para cada nível de Linq que você usa.fonte
ICollection difere de IEnumerable porque você pode adicionar itens à coleção, enquanto com IEnumerable você não pode. Portanto, em suas classes POCO, por exemplo, você deseja usar ICollection se pretende permitir que a coleção seja adicionada. Torne o ICollection virtual para se beneficiar do carregamento lento também.
fonte
Embora a questão tenha sido postada anos atrás, ela ainda é válida quando alguém está procurando o mesmo cenário.
Há um artigo recente do CodeProject [2015] que explica a diferença em muitos detalhes e representação gráfica com código de amostra . Não está focado diretamente na EF, mas ainda espero que seja de maior ajuda:
List vs IEnumerable vs IQueryable vs ICollection vs IDictionary
fonte