2009-08-13 6 views
1

Ich habe eine Entität Gruppe, die Entitäten mit einem zusammengesetzten Schlüssel mit ID (GUID) und CreatedAt (DateTime) hat. Diese CreatedAt ist, wenn die Entität erstellt wurde. Jeder Datensatz repräsentiert jede Version jeder Entität, so dass mehrere Datensätze die gleiche ID haben können.Entity Framework erstellt IQueryable der neuesten

Ich möchte eine IQueryable-Rückgabe-Methode erstellen, die ich so verwenden kann, dass sie nur die neueste Version der Entität zurückgibt, die angefordert wird, aber ich habe Mühe, die Antwort zu finden (wenn es tatsächlich eine gibt Antworten).

Ich weiß, dass ich eine Abfrage wie

(from e in context.Entities where e.ID = myID orderby e.CreatedAt).FirstOrDefault(); 

schreiben kann, aber ich will das in der Lage sein, anstatt zu tun:

(from e in context.GetCurrentEntities() where e.ID = myID).FirstOrDefault(); 

, so dass sie nur die neuesten Versionen der Rückkehr Entität erforderlich.

Ist das machbar?

Vielen Dank für Ihre Hilfe.

Lee

+0

dahlbyk und Craig Stuntz haben Ihnen korrekte Antworten auf das gegeben, was Sie versuchen zu tun. +1 Leute. Ich denke nach, ob eine kompilierte Abfrage in Bezug auf die Leistung besser für Sie funktioniert. Außerdem empfahl ich RP wegen der Verantwortung, die der Kontextklasse gegeben wurde, um die Funktionalität bereitzustellen, die IMO nicht dem Kontext gegeben werden sollte. – Perpetualcoder

Antwort

2

Wenn Sie Gruppe von ID, können Sie nur die jüngsten aus jeder Gruppe so etwas wie dies mit:

public IQueryable<Entity> GetCurrentEntities() 
{ 
    return from e in this.Entities 
      group e by e.ID into g 
      select g.OrderByDescending(e => e.CreatedAt).First(); 
} 

Sie nicht FirstOrDefault() brauchen, weil eine Gruppe nicht erstellt werden, wenn es zumindest ist ein Entity in der Gruppe.

+0

Danke - ich werde es versuchen –

0

Ich denke, Sie suchen ein kleineres Bild. Haben Sie überlegt, das Repository-Muster zu implementieren? LINK Wenn Sie Ihre Anforderungen anders betrachten, müssen Sie diese GetCurrentEntities-Methode zu Ihrer Kontextklasse hinzufügen.

+0

Hallo Perpetualcoder Danke für den Rat. Wir haben viel Zeit darauf verwendet, mit EF in unserem aktuellen Projekt fortzufahren. Ich fand EF zu sehr im Weg. Nachdem wir uns die Optionen angesehen haben (andere ORMs, handcodierte DALs), beherrschen wir EF und verwenden es als "typsicheren" SQL und vermeiden alle anderen "Funktionen". Welche Vorteile bietet das Repostiory Pattern hier? Sie haben Recht, dass ich die GetCurrentEntities() dem DataContext hinzufügen möchte. –

+0

Das Repository-Muster macht es einfach, die EF für ein Mock-Repository auszutauschen, wenn Sie Ihre Controller Unit testen. –

2

Wie wäre:

public partial class MyEntities // or whatever you call your ObjectContext 
{ 
    public IQueryable<Entity> GetCurrentEntities() 
    { 
     return from e in context.Entities 
       group e by e.ID into g 
       from ge in g 
       orderby ge.CreatedAt desc 
       select ge.First(); 
    } 
} 

Dieses off ist die Spitze von meinem Kopf, aber es sollte Ihnen den Einstieg.

+0

Danke - ist das gleichbedeutend mit dahlbyks Lösung oder gibt es ein anderes Ergebnis? –

+1

Sie sind gleichwertig. – dahlbyk

+0

Großartig - nochmals vielen Dank! –

Verwandte Themen