2010-07-19 13 views
5

Algo muy extraño está sucediendo en mi programa:¿Este es un problema de carga lenta de LINQ?

hago esta consulta agt.DefaultNr == 1 en una colección y obtener 3 artículos como Resultado:

IEnumerable<Agent> favAgents = 
      from agt in builtAgents where agt.DefaultNr == 1 select agt; 

Por cada elemento fijo el DefaultNr = 0

foreach (Agent noFavAgt in favAgents) 
{ 
    noFavAgt.DefaultNr = 0; 
} 

que hacer otra consulta, pero por alguna razón mi colección favAgents está vacía ahora!

IEnumerable<Agent> smallAgents = (from agt in favAgents 
    where agt.tempResultCount < 30 
    orderby agt.tempResultCount descending 
    select agt); 

¿Qué está pasando aquí?

¿Este es un problema de carga lenta de LINQ?

Parece que habrá algún tipo de re-consulta después de configurar todos los elementos = 0 porque mi colección está vacía.

+0

Cuál es la relación entre las dos consultas y por qué debería devolver un valor. Filtra en la propiedad 'tempResultCount' en la segunda consulta mientras cambia la propiedad' DefaultNr' en la primera consulta. ¿Estás hablando de LINQ to Objects (LINQ sobre colecciones en memoria) o algún tipo de herramienta O/RM (como LINQ to SQL)? – Steven

+0

¿Estás seguro de que es la colección la que está vacía y no solo que nada coincide con los criterios de tu segunda consulta? – Paolo

Respuesta

11

Esto no es perezoso cargando, es ejecución diferida. Cuando define su enumerable inicial, está definiendo una consulta , no una colección . Estás en lo cierto de que está realizando una nueva consulta; cada vez que itere sobre favAgents, ejecutará la consulta que usted definió. Si desea crear una lista basada en esa consulta que no cambie, agregue ToList().

var favAgents = 
    (from agt in builtAgents where agt.DefaultNr == 1 select agt).ToList(); 

Hacer esto creará una lista en memoria y almacenará en caché los resultados de la consulta en ese momento.

+0

Gracias. Aprendí algo nuevo hoy. – TalkingCode

6

Sí, su colección favAgents estará vacía ahora - ¡ha "desactivado" el bit en cada elemento que hacía que coincidiera con la consulta! Si repite más de favAgents dos veces, ejecutará la consulta dos veces. favAgents representa la consulta en sí, no los resultados.

Si desea conservar un determinado conjunto de resultados, utilice ToList o algo similar:

favAgents = favAgents.ToList(); 

Eso materializarse la consulta - llevará a cabo una vez y luego recordar los resultados en una lista, básicamente. ToArray tendría el mismo efecto, pero almacena los resultados en una matriz en su lugar.