Wie kann ich vorzuladen Aufzeichnungen mit Eltern-Kind-Selbstbezüge mit Schloss Activerecord?
-
07-07-2019 - |
Frage
My SQL-Tabelle sieht wie folgt aus:
CREATE TABLE Page (
Id int primary key,
ParentId int, -- refers to Page.Id
Title varchar(255),
Content ntext
)
und Karten auf die folgende Klasse in meinem Active Modell:
[ActiveRecord]
public class Page {
[PrimaryKey]
public int Id { get; set; }
[BelongsTo("Parent")]
public virtual Page Parent { get; set; }
[Property]
public string Title { get; set; }
[Property]
public string Content { get; set; }
[HasMany(typeof(Page), "Parent", "Page")]
public IList<Page> Children { get; set; }
}
Ich bin mit Active der Baumwurzeln mit dem folgenden Code abgerufen werden:
var rootPages = new SimpleQuery<Page>(@"from Page p where p.Parent is null");
return(rootPages.Execute());
Das gibt mir die richtigen Objektgraphen, aber eine SQL Profiler-Ablaufverfolgung zeigt, dass Kinder Seiten durch eine separate Abfrage für jeden Nicht-Blattknoten in dem Baum geladen werden.
Wie kann ich Active die gesamte Partie vorne ("SELECT * FROM Page")
zu laden und dann die Objekte im Speicher sortieren, um mir die erforderlich Eltern-Kind-Beziehungen?
Lösung
Der einfachste Weg dies zu tun ist, um die gesamte Tabelle zu holen, dann das Ergebnis filtern. Das ist ziemlich einfach, wenn Sie Linq verwenden.
var AllPages = ActiveRecordMediator<Page>.FindAll();
var rootPages = AllPages.Where(p => p.Parent == null);
Andere Tipps
Versuchen Sie folgendes:
var rootPages = new SimpleQuery<Page>(@"from Page p left join fetch p.Children where p.Parent is null");
return(rootPages.Execute());
Das wird die Kinder Sammlung von jeder Seite in der Ergebnismenge führt während der ersten Abfrage gefüllt geführt werden, die Ihre gesamte Abfragelast auf eine einzelne Abfrage reduzieren sollte.