2010-06-08 19 views
5

Me gustaría hacer que un determinado elemento seleccione la carga lenta tarde en mi consulta linq. Aquí está mi consultaCómo convertir esta consulta LINQ en carga diferida

var posts = from p in context.post 
      where p.post_isdeleted == false && p.post_parentid == null 
      select new 
      { 
       p.post_date, 
       p.post_id, 
       p.post_titleslug, 
       p.post_votecount, 
       FavoriteCount = context.PostVotes.Where(x => x.PostVote_postid == p.post_id).Count() //this should load latter 
      }; 

He suprimido el elemento favoriteCount en la consulta de selección y me gustaría que se ba añadido más adelante sobre la base de ciertas condiciones. Aquí está la manera que lo tengo cargado perezoso

if (GetFavoriteInfo) 
{ 
    posts = posts.Select(x => new { FavoriteCount = context.PostVotes.Where(y => y.PostVote_postid == x.post_id).Count() }); 
} 

Estoy recibiendo un error de sintaxis con esta la consulta anterior. Cómo corrijo esto

Respuesta

2

Cuando elimina el FavoriteCount en la consulta anterior, el tipo anónimo que se asigna a posts ya no tiene ese campo; luego, en la segunda consulta está creando otro tipo anónimo que solo tiene un FavoriteCount, por lo que cuando intenta reasignarlo al posts, aparece un error de tipo incompatible.

Una forma de hacer esto sería dejar el FavoriteCount en la primera consulta, pero que sea FavoriteCount = -1 (o algún otro valor para indicar que no se ha cargado todavía), y luego en el segundo se puede hacer:

posts = posts.Select(p => new { // reassign existing stuff, 
           p.post_date, 
           p.post_id, 
           p.post_titleslug, 
           p.post_votecount, 
           FavoriteCount = context.etc.etc. 
           }); 

que tiene que hacer la reasignación debido a los tipos anónimos son inmutables; Una forma de evitarlo sería hacer una clase PostInfo con esos campos, entonces simplemente puede configurar el FavoriteCount en la segunda consulta.

+0

Soy un novato en esto ... ¿Podría tener un ejemplo de reasignaciones? – Luke101

+0

@ Luke101: Ejemplo actualizado. – tzaman

1

1.- el tipo que usted está proyectando en la primera var no es del mismo tipo en el segundo puesto assigment primero es un tipo de Anonymus

puede probar esta

var posts = from p in context.post 
      where p.post_isdeleted == false && p.post_parentid == null 
      select new 
      { 
       p.post_date, 
       p.post_id, 
       p.post_titleslug, 
       p.post_votecount, 
       FavoriteCount = GetFavoriteInfo?context.PostVotes.Where(x => x.PostVote_postid == p.post_id).Count():null //this should load latter 
      }; 
+0

Tuve el mismo pensamiento, pero L2S traduce esto en una declaración de caso de SQL y el plan de ejecución en SSMS muestra que analiza el índice de PostVotes independientemente de si GetFavoriteInfo es verdadero o falso. –

1

Este blog entry Te ayudará. Una cosa más, puede habilitar/deshabilitar la carga diferida mediante la siguiente propiedad del objeto Contexto de datos.

context.DeferredLoadingEnabled = false; 
Cuestiones relacionadas