2010-06-08 9 views
5

Ich möchte ein bestimmtes Element zum Lazy Load letzteren in meiner Linq-Abfrage zu machen. Hier ist meine AbfrageWie diese LINQ-Abfrage auf lazy laden wird

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

ich das FavoriteCount Element in der Auswahlabfrage gelöscht haben und würde es gerne ba hinzugefügt später basierend auf bestimmten Bedingungen. Hier ist die Art, wie ich es lazy loaded habe

Ich bekomme einen Syntaxfehler mit dieser oben genannten Abfrage. Wie behebe ich das Problem?

Antwort

2

Wenn Sie die FavoriteCount in der früheren Abfrage löschen, hat der anonyme Typ, der posts zugewiesen wird, dieses Feld nicht mehr; dann in der zweiten Abfrage erstellen Sie eine andere anonymen Typ, der nur hat eine FavoriteCount in es - also, wenn Sie versuchen, die Zuordnung zu posts erhalten Sie einen inkompatiblen Typen Fehler.

Eine Möglichkeit, dies zu tun, um die FavoriteCount in der ersten Abfrage zu verlassen wäre, aber es FavoriteCount = -1 machen (oder ein anderer Wert, um anzuzeigen, es ist noch nicht geladen ist), und dann in dem zweiten können Sie tun:

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

Sie müssen die Neuzuordnung durchführen, weil anonyme Typen unveränderlich sind; Eine Möglichkeit wäre, eine PostInfo Klasse mit diesen Feldern zu erstellen, dann können Sie einfach FavoriteCount in der zweiten Abfrage festlegen.

+0

Ich bin ein Neuling in diesem .. Würdest du ein Beispiel für Neuzuweisungen haben? – Luke101

+0

@ Luke101: Beispiel aktualisiert. – tzaman

1

1.- die Art, die Sie auf dem ersten var projizieren ist nicht die gleiche Art auf dem zweiten assigment da erste ist ein anonymus Typ

Sie können versuchen, diese

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

Ich hatte den gleichen Gedanken - aber L2S übersetzt dies in eine SQL-Case-Anweisung und der Ausführungsplan in SSMS zeigt, dass es den PostVotes-Index scannt, unabhängig davon, ob GetFavoriteInfo wahr oder falsch ist. –

1

Diese blog entry wird dir helfen. Noch eine Sache, Sie können das verzögerte Laden aktivieren/deaktivieren, indem Sie die folgende Eigenschaft des Datenkontextobjekts verwenden.