2009-09-29 7 views
0

Je suis désolé si ma question n'est pas claire.Comment lire les données pour les classes imbriquées?

J'ai une classe qui contient des propriétés et l'une d'entre elles est "Parent" qui a le même type de cette classe.

Lorsque je lis des données de la base de données, je définis la valeur appropriée pour chaque propriété. Mais comment pourrais-je mettre la propriété "Parent" quand je l'ai lu de la base de données comme "ParentID".

Si ce n'est pas clair, je vais mettre Exemple.

merci beaucoup à l'avance.

C'est ma classe:

class smsPart 
    { 
     private int _id; 
     private smsPart _parent; 
     private string _name; 


     public int ID 
     { 
      get { return _id; } 
      set { _id = value; } 
     } 

     public smsPart Parent 
     { 
      get { return _parent; } 
      set { _parent = value; } 
     } 

     public string Name 
     { 
      get { return _name; } 
      set { _name = value; } 
     } 



     public smsPart() 
     { 
      this._id = 0; 
      this._parent = null; 
      this._name = null; 
     } 

     public smsPart(int pID, smsPart pParent, string pName, smsType pType) 
     { 
      this._id = pID; 
      this._parent = pParent; 
      this._name = pName; 
     } 
    } 

et quand je lis les données de base de données i remplir "ID" int et "Nom" en tant que chaîne.

mais comment je définirais "Parent" comme "smsPart" quand je le lis de la base de données comme "ParentID" int ??

+1

un exemple de code aiderait ... –

Répondre

1

Je suppose que vous avez créé vos classes de base de données manuellement ...

Vous pouvez utiliser un dictionnaire ID -> objet comme suit:

using System; 
using System.Collections.Generic; 

class Program { 

    class Outer { 

     static Dictionary<int, Outer> _ids = new Dictionary<int, Outer>(); 

     public Outer(int id) { 
      _ids[id] = this; 
     } 

     public class Inner { 
      public Outer Parent { 
       get; 
       set; 
      } 

      public Inner(int parentId) { 
       Parent = Outer._ids[parentId]; 
      } 

     } 
    } 

    static void Main(string[] args) { 
     Outer o = new Outer(1); 
     Outer.Inner i = new Outer.Inner(1); 
    } 
} 

Vous pouvez également envisager d'utiliser linq to sql.

1

Si vous voulez utiliser l'évaluation paresseuse, une façon est de créer un champ privé pour la ParentId qui vous renseignez sur la création, un champ parent privé et un bien public parent:

public class YourClassHere 
{ 
    private YourClassHere _parent; 
    private int _parentId; 

    public YourClassHere Parent 
    { 
     get 
     { 
      if (_parent == null) 
      { 
       _parent = DBWrapper.GetMyClassById(_parentId) 
      } 
      return _parent 
     } 
    } 
} 
+0

Ce serait très bien, mais je veux obtenir des informations de la base de données juste une fois que je pourrais le faire de manière plus efficace ??. –

0

Ensuite, vous lisez les données parent de son ID et créer un objet (la même classe) puis lui transmettre les données pour initialiser les propriétés (exactement comme vous le faites avec l'enfant).

Ce qui précède n'est qu'un exemple. La façon de le faire dépend de la façon dont vous gérez l'objet actuel (l'enfant) et vous ne nous avez donné aucun code à voir.

D'après ce que j'ai fait. Il ressemble à ceci:

class Data { 
    public Data(int pDataID) { 
     // Load data of pDataID 
     // Assign the loaded data 

     this.parent = new Data(ParentID); 
    } 
} 

J'espère que cela montre assez pour que vous l'adaptiez au vôtre.

0

Vous avez probablement besoin de faire quelque chose comme ça

Parent = GetParentById(ParentID); 

Bien que cela dépend vraiment de la façon dont vous avez mis en place votre accès aux données couche

0

Vous devrez récupérer de manière récursive les données de la base de données afin de matérialise correctement votre objet, jusqu'à ce que le dernier ParentID de l'enregistrement soit nul.

0

vous remercie de me aider je l'ai fait quelque chose comme ceci:

Collection<smsPart> list = new Collection<smsPart>(); 
    Dictionary<int, smsPart> dic = new Dictionary<int, smsPart>(); 

    using (conn) 
    { 
     conn.Open(); 
     SqlDataReader dr = command.ExecuteReader(); 
     while (dr.Read()) 
     { 
      smsPart xPart = new smsPart(); 

      xPart.ID = int.Parse(dr["ID"].ToString()); 
      if (!string.IsNullOrEmpty(dr["Parent"].ToString())) 
       xPart.ParentID = int.Parse(dr["Parent"].ToString()); 
      xPart.Name = dr["Name"].ToString(); 

      dic.Add(xPart.ID, xPart); 
     } 
    } 
    foreach (smsPart childPart in dic.Values) 
    { 
     if (childPart.ParentID > 0) 
     { 
      childPart.Parent = dic[childPart.ParentID]; 
     } 
     list.Add(childPart); 
    } 
    return list; 

Alors est-ce bon à votre avis ??.

Questions connexes