O foreach lento () em uma consulta LINQ - ToList () aumenta imensamente o desempenho - por que isso?

Eu meio que entendo todo o conceito de execução atrasada, mas o seguinte me deixou perplexo ...

Em uma DataTable contendo cerca de 1000 linhas, eu chamoAsEnumerable (). Em seguida, seleciono as entidades retornadas em um IEnumerable de classes fortemente tipadas(1)... Aqui é onde eu fico confuso: faço um loop foreach na coleção; selecionando itens dos itens individuais da coleção usando um monte deOnde() chamadas2) ... E é muito lento.

DataTable.AsEnumerable().Select(r => new ObjectRepresentation { ... });item.Where(i => i.SomeEnum == SomeEnum.Something)


... Mas se eu ligarListar() logo depois da minhaAsEnumerable () Na DataTable, o loop foreach leva menos de um segundo para ser concluído.

O que estou perdendo aqui? Estou efetivamente chamandoAsEnumerable () cada vez que meu loop itera? Ou sempre que acesso um item da coleção? Ou cada vez que faço umaOnde() chamar um item da coleção? Ou todos os itens acima?


Atualizar

Código um pouco completo:

public class ObjectRepresentation
{
    public SomeEnum SomeEnum { get; set; }
}


var collection = DataTable.AsEnumerable().Select(r => new ObjectRepresentation
{
    SomeEnum = (SomeEnum)Convert.ToInt32(r["SomeEnum"])
});

foreach(var item in collection) // slow loop
{
    // 10 or so Where() calls on item inside this loop
}

collection = collection.ToList(); // Hit hyper speed button!

foreach(var item in collection) // fast loop
{
    // 10 or so Where() calls on item inside this loop
}

questionAnswers(3)

yourAnswerToTheQuestion