2011-02-04 2 views
0

J'ai quelques données hiérarchiques. La classe du modèle que j'utilise ressemble à ceci:Récupération des données hierarchal dans le code d'entité-Premier

public class Category 
{ 
    [Key] 
    public int CategoryID { get; set; } 

    [Required] 
    [StringLength(64)] 
    public string Name { get; set; } 

    public int? ParentCategoryID { get; set; } 
    [ForeignKey("ParentCategoryID")] 
    public Category ParentCategory { get; set; } 

    [Required] 
    public int ListOrder { get; set; } 


    // left/right 
    public int TreeLeft { get; set; } 
    public int TreeRight { get; set; } 
} // eo class Category 

Je l'ai utilisé les techniques décrites here pour stocker mes données, et l'insertion et la récupération de données ne sont pas un problème.

Ce que je voudrais faire, est d'ajouter une collection de catégorie à cette classe:

public virtual IEnumerable<Category> {get; set; } 

Je l'ai utilisé cette technique dans le passé (appris des tutoriels Mvc), d'inclure des tableaux liés lors de l'obtention Les données. Cependant, quand j'ai essayé ceci j'ai reçu une erreur en ce qui concerne IEnumerable <> étant abstrait (ce qui est compréhensible, je suppose que le cadre n'a pas pu comprendre ce que je veux faire) ...

... et en effet , étant nouveau à LINQ, je n'ai aucune idée de ce que le LINQ ressemblerait qui me donnerait une collection de Category instances dont chacune avait leurs enfants à l'intérieur.

Si ce n'est pas possible, je suppose que je peux construire la liste manuellement, utiliser une requête LINQ régulière pour obtenir toutes les catégories à une position particulière (et leurs enfants) et remplir tout cela manuellement. Je me demandais si LINQ pouvait faire ça pour moi?

Merci d'avance!

+0

Etes-vous sûr que vous ne voulez pas utiliser l'héritage? – Euphoric

Répondre

1

Si vous avez une autoréférence fk que la collection doit être généré automatiquement lorsque vous ajoutez la table au fichier dbml

Et ressemble à quelque chose comme ceci:

[global::System.Data.Linq.Mapping.AssociationAttribute(Name="Category_Category", Storage="Categories", ThisKey="pkCategoryID", OtherKey="ParentCategoryID")] 
public EntitySet<Category> Categories 
{ 
    get 
    { 
    return this._Categories; 
    } 
    set 
    { 
    this._Categories.Assign(value); 
    } 
} 
+0

Mais, comme les catégories enfant ont des enfants etc., cela ne nécessiterait-il pas une sorte de LINQ récursif? Je ne peux pas voir comment le faire sans les remplir manuellement moi-même. –

+0

Il ne vous donnera que les enfants en profondeur un. Si vous voulez aussi obtenir les enfants des enfants, je vous suggère d'écrire une fonction récursive en mémoire car il n'y a pas linq2sql qui puisse le faire. – Magnus

+0

est donc la meilleure chose à faire pour ajouter une propriété concrète Liste à la classe Catégorie et le remplir manuellement? Je vais bien faire ça, je peux juste récupérer tout l'arbre (dans l'ordre, aucune récursivité requise) et les peupler moi-même. –

0

N'utiliser IEnumerable<Category> mais Collection<Category> . Si c'est votre problème ..

Questions connexes