2010-05-28 7 views
2

J'ai vérifié avant de poster, mais je n'ai pas trouvé de solution. Je suis nouveau à linq et ça me vide le cerveau pour le comprendre. J'ai un XML et je veux utiliser linq pour remplir un objet qui a un objet enfant.objets enfants dans linq

le xml et mon linq sont ci-dessous. Mon numéro est sur cette ligne

TaskItems = t.Elements("taskdetail").ToList<TaskItem>() //this line doesn't work 

Comment remplir cet objet enfant?

var task1 = from t in xd.Descendants("taskheader") 
      select new 
      { 
       Id = t.Element("id").Value, 
       Name = t.Element("name").Value, 
       IsActive = Convert.ToBoolean(Convert.ToInt16(t.Element("isactive").Value)) 
       TaskItems = t.Elements("taskdetail").ToList<TaskItem>() 
      }; 

<tasks> 
    <taskheader> 
    <id>1</id> 
    <name>some task</name> 
    <isactive>1</isactive> 
    <taskdetail> 
     <taskid>1</taskid> 
     <name>action1</name> 
     <value>some action</value> 
    </taskdetail> 
    <taskdetail> 
     <taskid>1</taskid> 
     <name>action2</name> 
     <value>some other action</value> 
    </taskdetail> 
    </taskheader> 
</tasks> 

public class Task 
{ 
     public int Id; 
     public string Name; 
     public bool IsActive; 

     public List<TaskItem> TaskItems = new List<TaskItem>(); 
} 

public class TaskItem 
{ 
     public int TaskId; 
     public string Name; 
     public string Value; 
} 

Répondre

2

Essayez ceci:

var tasks = from t in xd.Descendants("taskheader") 
      select new Task 
      { 
       Id = (int)t.Element("id"), 
       Name = t.Element("name").Value, 
       IsActive = t.Element("isactive").Value == "1", 
       TaskItems = t.Elements("taskdetail").Select(e => new TaskItem 
       { 
        TaskId = (int)e.Element("taskid"), 
        Name = (string)e.Element("name"), 
        Value = (string)e.Element("value"), 
       }).ToList() 
      }; 
+1

Cela ressemble à elle renvoie une liste de type anonyme. Avez-vous oublié de spécifier 'select new Task' ou cela fonctionnera-t-il tel quel? – CoderDennis

+0

@Dennis Palmer: Il devrait probablement être une nouvelle tâche, je vais mettre à jour la réponse. Le code original a le même bug/fonctionnalité - J'ai seulement changé la partie 'TaskItems = ...'. –

+0

@Dennis Palmer: OK, je l'ai mis à jour. J'ai aussi dû lancer l'Id à un entier pour le compiler, et pendant que j'y étais, j'ai simplifié la logique de calcul de 'IsActive'. Merci pour le commentaire. –

Questions connexes