que tipo de captar toda retrasado el concepto de ejecución, pero los siguientes me ha intrigado ...Slow foreach() en una consulta LINQ - ToList() aumenta enormemente el rendimiento. ¿Por qué es esto?
En un DataTable que contiene aproximadamente 1000 filas, llamo AsEnumerable(). Luego selecciono las entidades devueltas a un IEnumerable de clases fuertemente tipadas (1) ... Aquí es donde me confundo: hago un ciclo foreach en la colección; seleccionando cosas de los elementos individuales en la colección usando un grupo de Donde() llama al (2) ... Y está muerto lento.
DataTable.AsEnumerable().Select(r => new ObjectRepresentation { ... });
item.Where(i => i.SomeEnum == SomeEnum.Something)
... Pero si llamo ToList() justo después de mi AsEnumerable() llamada en el DataTable, el foreach el bucle tarda menos de un segundo en completarse.
¿Qué me falta aquí? ¿Estoy efectivamente llamando al AsEnumerable() cada vez que mi ciclo itera? ¿O cada vez que accedo a un artículo en la colección? O cada vez que hago un ¿Dónde() llama a un artículo en la colección? O todo lo de arriba?
actualización
código Algo completa:
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
}
Parece que está haciendo una llamada a la base de datos en cada iteración. Puede ejecutar el Analizador de SQL para ver si eso es cierto ... –
¿Por qué llamar a AsEnumerable()? AsEnumerable cambia un objeto en tiempo de compilación a IEnumerable si ya implementa IEnumerable . ¿Por qué no iterar las filas usando la propiedad Filas de una tabla? –
Wix
@Wix: 'DataTable' aún no implementa' IEnumerable '. Cuando llamas a 'AsEnumerable' en' DataTable' estás llamando al método 'DataTableExtensions.AsEnumerable', * not *' Enumerable.AsEnumerable'. http://msdn.microsoft.com/en-us/library/system.data.datatableextensions.asenumerable.aspx –
LukeH