2014-12-15 24 views
5

sto utilizzando Entity Framework 6 con codice In primo luogo, e ho una tabella con la seguente struttura:Entity Framework Auto Join

public class Item 
{ 
    [Key] 
    public int ItemId { get; set; } 

    [Required] 
    [MaxLength(255)] 
    public string Name { get; set; }} 

    public Item Parent { get; set; } 
    public virtual List<Item> Children { get; set; }  
} 

Vorrei sapere se è possibile salire su una singola query/viaggio al database, tutto Items attraverso il mio albero fino alla radice, fornendo un argomento come itemId.

e.g Datemi tutti i genitori da ItemId 55 fino a quando non viene trovato alcun genitore.

+3

non credo sia possibile. Probabilmente è necessario mappare a un CTE ricorsivo con stored proc. – GraemeMiller

+0

Echoing @GraemeMiller qui: Ho dovuto fare qualcosa di simile di recente, ed è così che ho finito per farlo. – IronMan84

risposta

0

Non è possibile ottenere tutti i genitori in un unico viaggio utilizzando qualsiasi codice sano.

Tuttavia si può fare qualcosa di simile: https://stackoverflow.com/a/11565855/304832

Modificando il vostro soggetto un po ', è possibile aggiungere 2 collezioni derivati:

public class Item 
{ 
    [Key] 
    public int ItemId { get; set; } 

    [Required] 
    [MaxLength(255)] 
    public string Name { get; set; }} 

    public virtual Item Parent { get; set; } // be sure to make this virtual 
    public virtual List<Item> Children { get; set; } 

    public virtual ICollection<ItemNode> Ancestors { get; set; } 
    public virtual ICollection<ItemNode> Offspring { get; set; } 
} 

Si ha bisogno di introdurre una nuova entità per fare questo lavoro però, che assomiglia a questo:

public class ItemNode 
{ 
    public int AncestorId { get; set; } 
    public virtual Item Ancestor { get; set; } 

    public int OffspringId { get; set; } 
    public virtual Item Offspring { get; set; } 

    public int Separation { get; set; } // optional 
} 

Ora, se si vuole

tutti i genitori da ItemId 55 fino a quando non viene trovato genitore

... si può fare qualcosa di simile:

IEnumerable<Item> allParentsFrom55 = dbContext.Set<Item>() 
    .Find(55).Ancestors.Select(x => x.Ancestor);