Comment précharger des enregistrements avec des références auto-parent-enfant à l'aide de Castle ActiveRecord?

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

Question

Ma table SQL ressemble à ceci:

CREATE TABLE Page (
    Id int primary key,
    ParentId int, -- refers to Page.Id
    Title varchar(255),
    Content ntext
)

et mappe à la classe suivante dans mon modèle ActiveRecord:

[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; }
}

J'utilise ActiveRecord pour récupérer les racines de l'arborescence à l'aide du code suivant:

var rootPages = new SimpleQuery<Page>(@"from Page p where p.Parent is null");
return(rootPages.Execute());

Cela me donne le graphe d'objet correct, mais une trace de SQL Profiler indique que les pages enfants sont en cours de chargement par une requête distincte pour chaque nœud non-feuille de l'arbre.

Comment puis-je obtenir qu'ActiveRecord charge tout le lot à l'avance ("SELECT * FROM Page") , puis trie les objets en mémoire pour obtenir les relations parent-enfant requises?

Était-ce utile?

La solution

La méthode la plus simple consiste à récupérer le tableau entier, puis à filtrer le résultat. C’est assez facile si vous utilisez linq.

var AllPages = ActiveRecordMediator<Page>.FindAll();
var rootPages = AllPages.Where(p => p.Parent == null);

Autres conseils

Essayez ceci:

var rootPages = new SimpleQuery<Page>(@"from Page p left join fetch p.Children where p.Parent is null");
return(rootPages.Execute());

Ceci aura pour effet de remplir la collection d'enfants de chaque page du jeu de résultats au cours de la requête initiale, ce qui réduira la charge globale de votre requête en une seule requête.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top