2010-09-30 3 views
0

Je n'ai aucune idée précise de la façon de formuler cette question, alors pardonnez-moi si je n'utilise pas la bonne terminologie.Linq XML - créer des types complexes

J'ai un System.Xml.Linq.XElement el qui contient un document XML. Je veux interroger une partie du XElement et ajouter des objets utilisateur (Upload) à une liste générique (UploadList tenue dans une propriété de page) comme ceci:

this.UploadsList.Add((from el1 in el.Descendants("Uploads") 
             select new Upload 
             { 
              Comments = el1.Element("Comments") != null ? el1.Element("Comments").Value : "" 
              , 
              ***ConsentForImageUse.Text=el1.Element("SomeNode") != null ? el1.Element("SomeNode").Value : ""*** 
              , 
              DateImageProduced = el1.Element("DateImageProduced").Value != "" ? DateTime.Parse(el1.Element("DateImageProduced").Value) : DateTime.MinValue 
              , 
              ImageTakenBy = el1.Element("ImageTakenBy") != null ? el1.Element("ImageTakenBy").Value : "" 
             }).First<Upload>()); 

Le compilateur se plaint du peu avec les astérisques.

Mon objet de téléchargement a une propriété ConsentForImageUse qui est elle-même une classe avec quelques propriétés.

L'erreur est Invalid initialiser le membre déclarant. Est-ce que quelqu'un sait si je peux créer des objets 'complexes' en utilisant Linq comme ça?

Répondre

2

En raison de la façon dont les initialiseurs d'objet sont spécifiés, vous ne pouvez pas définir une propriété d'une propriété dans un. Au lieu de cela, créez un objet ConsentForImageUse en tant que liaison dans votre requête LINQ et attribuez-le à la propriété ConsentForImageUse de l'objet Upload. Sans plus de connaissance de votre modèle d'objet précis, j'ai fait quelques suppositions, mais cela devrait fonctionner pour vous.

var uploads = from el1 in el.Descendants("Uploads") 
       let consent = new ConsentForImageUse() { Text = el1.Element("SomeNode") != null ? el1.Element("SomeNode").Value : string.Empty } 
       select new Upload 
       { 
        Comments = el1.Element("Comments") != null ? el1.Element("Comments").Value : string.Empty, 
        ConsentForImageUse = consent, 
        DateImageProduced = el1.Element("DateImageProduced") != null ? el1.Element("DateImageProduced").Value : string.Empty, 
        ImageTakenBy = el1.Element("ImageTakenBy") != null ? el1.Element("ImageTakenBy").Value : string.Empty 
       }; 

list.Add(uploads.First()); 
+0

Pas besoin d'utiliser 'let' vraiment. Vous pouvez déplacer tout ce code où 'consent' est. De toute façon fonctionne. –

+0

Pour moi, le 'let' est un choix esthétique. J'ai tendance à considérer les initialiseurs d'objet excessivement longs comme disgracieux. Vous avez raison, cependant - cela fonctionnera dans les deux cas. – Ben

+0

Cela semble prometteur - je vais essayer le matin - merci! – adrianos

Questions connexes