Como posso pré-carregar os registros com auto-referências pai-filho usando Castle ActiveRecord?

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

Pergunta

My SQL tabela esta aparência:

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

e mapas para a seguinte classe no meu modelo 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; }
}

Eu estou usando ActiveRecord para recuperar as raízes da árvore usando o seguinte código:

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

Isso me dá o gráfico do objeto correto, mas um SQL Profiler mostra traço que páginas filhas estão sendo carregados por uma consulta separada para cada nó não-folha na árvore.

Como posso obter ActiveRecord para carregar todo o lote até ("SELECT * FROM Page") frente e, em seguida, tipo o in-memory objetos para me dar as relações necessárias entre pais e filhos?

Foi útil?

Solução

A maneira mais fácil de fazer isso é para buscar a tabela inteira, em seguida, filtrar o resultado. Isso é muito fácil, se você estiver usando linq.

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

Outras dicas

Tente isto:

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

Isto fará com que a coleção Children de cada página no conjunto de resultados para ser preenchido durante a consulta inicial, o que deve reduzir a sua carga total consulta para uma única consulta.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top