Wie kann ich vorzuladen Aufzeichnungen mit Eltern-Kind-Selbstbezüge mit Schloss Activerecord?

StackOverflow https://stackoverflow.com/questions/279392

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?

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top