2016-11-08 5 views
0

Lassen Sie uns sagen, ich habe eine solche Struktur:EF6 eifrig Laden innen POCO

  • Branche: Id
  • Gruppen: Id
  • Branch: BranchId, GroupId, Da Till

Relations sind Branch 1..N BranchGroup 1..1 Group, so dass die erzeugte Branch Klasse eine ICollection<BranchGroup> BranchGroups Navigationseigenschaft hat.

Und es ist eine Eigenschaft innerhalb Branch POCO, wiederkehrende Strom Gruppen (etwas vereinfacht):

public List<Group> Groups => BranchGroups.Where(bg => bg.Since <= DateHelper.Current && 
                 bg.Till >= DateHelper.Current) 
              .Select(bg => bg.Group).ToList(); 

ich es nennen und db wird mit Tausenden von Anfragen, die jeweils für eine Gruppe explodierte. Ist es möglich, es irgendwie zu optimieren, ohne Zugriff auf dbContext (oder zumindest aktuellen Kontext von innerhalb der Entität zu erreichen)?

UPD: einfachste reale Abfrage sieht wie folgt aus:

public List<Group> Groups => BranchGroups.Where(bg => bg.Since <= DateHelper.Current && 
                 bg.Till >= DateHelper.Current) 
              .Select(bg => bg.Group) 
              .Where(g => !g.Deleted).ToList(); 
+3

Eine solche Abfrage sollte keine DB-Abfrage pro Gruppe erzeugen. Du hast gesagt, dass es vereinfacht ist, also hilft vielleicht ein Blick auf die vollständige Abfrage ein wenig. – Evk

+0

@Evk sicher, aktualisiert – Xandrmoro

Antwort

1

Das ist nicht möglich zu sein scheint - wenn Sie Navigationseigenschaft zugreifen (BranchGroups in diesem Fall), ganz ähnlichen Satz wird aus der Datenbank gezogen, so Der Rest Ihrer Abfrage ("Wo", "Auswählen", "Wo") wird über den Datensatz im Speicher ausgeführt, sodass er nicht in die Datenbankabfrage übersetzt wird. Dann ist bg.Group auch Navigationseigenschaft, also um eine zu erhalten, wird eine getrennte Datenbankabfrage durchgeführt, gerade wie Sie beobachten.

Reale POCO-Objekte sollten keine Beziehung zu DbContext haben, sie sind nur einfache Objekte. Sie können (und sollten nicht) in der Lage sein, aus POCO heraus in den Kontext zu gelangen (oder das ist nicht mehr POCO).

So Ihre Optionen sind:

  1. Gruppen Eigenschaft füllen, wenn Zweig Objekt Konstruktion (nicht gut, wenn man nicht immer jene Gruppen laden müssen).
  2. Abruf von Gruppen mit Hilfe der externen Kontextreferenz (nicht aus POCO).
  3. Vielleicht, wenn Zweig Objekt konstruieren, stellen Gruppen Eigenschaft wie folgt:

    branch.Groups = context.BranchGroups.Where(c => c.BranchID = branch.ID && ...); // the rest of your query 
    

    Dann wird es noch POCO sein (Gruppen sind nur IEnumerable), sondern enthält Abfrage, die Sie benötigen, die über den Zugang faul geladen ist (und kein explizite Verweise auf den Kontext).