2011-01-13 7 views
1

Ich habe ein Ansichtsmodell (unten).So erstellen Sie Ansichtsmodell, ohne Sammlungen im Speicher zu sortieren

public class TopicsViewModel 
{ 
    public Topic Topic { get; set; } 
    public Reply LastReply { get; set; } 
} 

Ich möchte eine IQueryable<TopicsViewModel> mit Werten aus meiner IQueryable<Topic> Sammlung und IQueryable<Reply> Sammlung füllen. Ich möchte nicht die angefügte Entitätssammlung (dh Topic.Replies) verwenden, da ich nur die letzte Antwort für dieses Thema möchte und dazu tue, dass Topic.Replies.Last() die gesamte Entitätssammlung in den Arbeitsspeicher lädt und dann die letzte in der Liste. Ich versuche, in IQueryable zu bleiben, damit die Abfrage in der Datenbank ausgeführt wird.

Ich möchte auch nicht durch Themen foreach und replyRepository.Replies abfragen, da das Durchlaufen von IQueryable<Topic> das verzögerte Laden beginnt. Ich würde es vorziehen, einen Ausdruck zu bilden und alle Beinarbeit in den unteren Schichten erledigen zu lassen.

Ich habe folgendes:

IQueryable<TopicsViewModel> topicsViewModel = from x in topicRepository.Topics 
               from y in replyRepository.Replies 
               where y.TopicID == x.TopicID 
               orderby y.PostedDate ascending 
               select new TopicsViewModel { Topic = x, LastReply = y }; 

Aber das funktioniert nicht. Irgendwelche Ideen, wie ich ein IQueryable oder IEnumerable von TopicsViewModel auffüllen kann, damit es die Datenbank abfragt und Themen und die letzte Antwort des Themas ergreift? Ich versuche wirklich, alle Antworten zu diesem Thema zu vermeiden. Ich möchte nur die letzte Antwort holen.

Vielen Dank für Ihre Einblicke.

+0

Gibt es eine Navigationseigenschaft zwischen Themen und Antworten? –

+0

Ja, das ist die beigefügte Entitätssammlung, von der ich gesprochen habe. Ich möchte jedoch nicht auf diese Navigationseigenschaft zugreifen und das verzögerte Laden dieser gesamten Sammlung auslösen. Wenn ich alle Elemente in dieser Sammlung benötige, wäre das sinnvoll, aber da ich nur das letzte Element in dieser Sammlung benötige, wäre es besser, irgendwie in IQueryable zu bleiben. – Chev

+0

Wenn Sie sagen "funktioniert nicht", welcher Teil funktioniert nicht? Laufzeitfehler, nichts zurückgegeben oder alles zurückgegeben ..? –

Antwort

1

Da niemand antwortet, gehe ich jetzt mit einer foreach Lösung. Ich finde, dass das Forschen durch die Themen, die schließlich lazy loaded werden, sowieso viel besser ist, als eine Sammlung von Antworten zu füllen, nur damit ich auf das letzte Objekt in der Sammlung zugreifen kann. Hier

ist, was ich jetzt habe:

   List<TopicsViewModel> topicsViewModelList = new List<TopicsViewModel>(); 
       foreach (Topic topic in topics) 
       { 
        Reply lastReply = replyRepository.GetRepliesBy_TopicID(topic.TopicID).OrderBy(x => x.PostedDate).LastOrDefault(); 

        topicsViewModelList.Add(new TopicsViewModel 
        { 
         Topic = topic, 
         LastReply = lastReply 
        }); 
       } 

ich gerade lade ich meine IQueryable<Topics> zuerst, dann durch die endgültigen Ergebnisse Looping (so dass die korrekte Paging der Daten zu gewährleisten, vor Looping durchgeführt) und Laden in der letzten Antwort. Dies scheint zu vermeiden, dass eine Sammlung von Antworten jemals gefüllt wird und stattdessen nur die letzte Antwort für jedes Thema abgerufen wird.

+1

Müssen Sie topicsViewModelList nicht instanziieren? – Grubsnik

+0

Ja, oh! +1 für die Korrektur. – Chev

0
 from r in replies 
     group r by new { r.TopicId } into g 
     select new 
      { 
       TopicId = g.Key.TopicId, 
       LastReply = g.Max(p => p.PostedDate) 
      } 
+0

Das ist egal. Alle Versuche, die Auflistung der Navigationseigenschaft abzufragen, lösen das verzögerte Laden für die ENTIRE-Sammlung aus. Dann LINQ führt die .First() oder .Last(), die gut funktioniert, aber hinter den Kulissen, die ganze Sammlung wurde in den Speicher geladen und dann ergriffen wir das erste oder letzte Objekt in der Sammlung. – Chev

+0

Wahr. Also, vielleicht sind Sie hier nur die Wahl, die .Max() -Funktion zu verwenden. –

+0

Gefunden ein gutes Beispiel, das SelectMany mit .Max() kombiniert. http://stackoverflow.com/questions/2462261/linq-to-sql-select-targets-with-max-date –

Verwandte Themen