2009-09-14 10 views
1

J'ai un Linq assez simple à la requête XML:Comment produire plusieurs éléments dans Linq à l'énumérateur XML?

var q = from c in xd.Descendants("PrimaryCategory") 
     where (int)xd.Element("PrimaryCategoryID") == 3 
     select new {campaignName = c.Element("CategoryList").Element("CategoryName").Value, 
     campaignURL = c.Element("CategoryList").Element("CategoryURL").Value}; 

Cela ne fin pour tirer le categoryname et la categoryURL du premier élément de CatégorieListe du PrimaryCategoryID 3. Le seul problème est qu'il ya plusieurs nœuds CatégorieListe dans la PrimaryCategory et j'en ai besoin pour retourner une liste énumérable d'objets avec tous les noms et toutes les URL.

Qu'est-ce que je fais de mal?

+1

Notez que dans votre requête, vous utilisez 'xd.Element (" PrimaryCategoryID ") == 3'. Je pense que vous vouliez utiliser 'c' ici. –

+0

Pourquoi cela fonctionne-t-il très bien dans les deux sens? Comment la syntaxe d'origine la romprait-elle s'il y avait plus de trois PrimaryCategoryID? Mais merci de le signaler. Je suis nouveau à LINQ et encore plus récent à LINQ to XML. –

Répondre

0

Si vous y attendez seulement d'être un seul élément PrimaryCategory avec l'ID de la catégorie concernée, je ferais:

var category = xd.Descendants("PrimaryCategory") 
       .Where(c => (int)c.Element("PrimaryCategoryID") == 3) 
       .Single(); // Could use `FirstOrDefault` if there could be none 

var query = from list in category.Elements("CategoryList") 
      select new { Name = list.Element("CategoryName").Value, 
         Url = list.Element("CategoryURL").Value }; 

Vous pouvez faire tout cela en une seule requête, mais je pense que serait plus déroutant que de séparer les deux bits.

1

Bien que j'ai marqué une réponse différente comme "la" réponse, j'ai résolu ce problème d'une manière différente. Même si je n'ai rien pour accepter ma propre réponse et JS est parfaitement valide et utile. Donc, en tant que seul répondant à part moi, le kudos va à lui. Pour référence, ma propre solution est incluse ici.

Ce que je finalement installé sur était:

var xmlcampaigns = from c in xd.Descendants("PrimaryCategory") 
        where (int)c.Element("PrimaryCategoryID") == 3 
        select new {campaignName = c.Elements("CategoryList").Elements("CategoryName").ToList(), 
        campaignURL = c.Elements("CategoryList").Elements("CategoryURL").ToList()}; 

Je puis extrait les résultats à deux objets Liste et itérés ceux-ci.

Questions connexes