2010-06-08 16 views
5

Linq sorgumda tembel yük için belirli bir seçim öğesi yapmak istiyorum. Burada seçme sorguda FavoriteCount öğeyi sildiniz ve belirli koşullara sonradan eklenen dayalı ba içinde olmasınıBu LINQ sorgusunu tembel yüklemeye nasıl döndürürüm

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 
      }; 

benim sorgusu olur. İşte işte şu anki açık Tempoyu yüklüyorum

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

Yukarıdaki sorguda bir sözdizimi hatası alıyorum. Bu

cevap

2

'u nasıl düzeltirim? Önceki sorguda FavoriteCount'u sildiğinizde, posts'a atanan anonim tür bu alana artık sahip değildir; Daha sonra ikinci sorguda sadece İçinde FavoriteCount sahip olduğunu başka anonim tip oluştururken - Eğer uyumsuz bir tip hata alıyorum posts bu yeniden atamak için denemek böylece zaman.

ilk sorguda FavoriteCount bırakmak olacaktır Bunu yapmak, ancak FavoriteCount = -1 ve sonra ikinci birinde yapabileceğiniz (veya başka bir değer henüz yüklü değil belirtmek için) yapmak için bir yolu:

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

Yeniden adlandırma yapmak zorundasınız çünkü anonim tipler değiştirilemez; Bunun etrafında bir yol bu alanlar ile bir PostInfo sınıfı yapmak, daha sonra ikinci sorguda FavoriteCount ayarlayabilirsiniz.

+0

Ben bu konuda yeni biriyim ... Yeniden gönderim örneği olabilir mi? – Luke101

+0

@ Luke101: Örnek güncellendi. – tzaman

1

1.- İlki bir isimsiz tip

bu

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

Aynı düşünce vardı - ama L2S bunu bir SQL durum ifadesine çevirir ve SSMS'deki yürütme planı, GetFavoriteInfo'nun doğru veya yanlış olup olmamasına bakılmaksızın PostVotes endeksini taradığını gösterir. –

1

Bu blog entry deneyebilirsiniz çünkü ilk var üzerinde yansıtma tipi ikinci atama seçeneğinin aynı türde değil sana yardım edeceğim. Bir şey daha, Veri Bağlamı nesnesinin aşağıdaki özelliğini kullanarak tembel yükleme özelliğini etkinleştirebilir/devre dışı bırakabilirsiniz.

context.DeferredLoadingEnabled = false;