2009-09-09 7 views
2

Comment intégrer le nombre ordinal d'élément en tant qu'attribut dans cette requête linq.Position ordinale de l'élément dans IENumerable Collection (Linq à XMl)

var AllSections = from s in xmlDoc.Descendants("section") 
         select new 
         { 
          id = s.Attribute("id").Value, 
          themeTitle = s.Element("themeTitle").Value, 
          themeText = s.Element("themeText").Value, 
          objects = (from a in AllObjects 
            join b in s.Descendants("object") 
            on a.Attribute("accessionNumber").Value equals 
             b.Attribute("accessionNumber").Value 
             //select a 
             select new 
             { 
             //index = insert ordinal id/index of element 

             ObjectTitle = a.Element("ObjectTitle").Value, 
             ObjectText = a.Element("textentry").Value, 


             } 
             ) 


         }; 

Répondre

2

vous a donné Skeet @ Jon la surcharge appropriée de Select à utiliser, et est-il ici dans votre requête:

var AllSections = from s in xmlDoc.Descendants("section") 
    select new 
    { 
     id = s.Attribute("id").Value, 
     themeTitle = s.Element("themeTitle").Value, 
     themeText = s.Element("themeText").Value, 
     objects = (from a in AllObjects 
        join b in s.Descendants("object") 
         on a.Attribute("accessionNumber").Value 
         equals b.Attribute("accessionNumber").Value 
        select a).Select((a, index) => 
         new 
         { 
          Index = index, 
          ObjectTitle = a.Element("ObjectTitle").Value, 
          ObjectText = a.Element("textentry").Value, 
         }) 
    }; 
+0

C'est donnant l'indice * dans la jointure * plutôt que l'indice de '' l'intérieur a' AllObjects'. Cela * peut * être ce qui est requis, bien sûr ... mais j'ai édité ma réponse pour donner l'index de 'a'. –

+0

Bonne prise, je n'arrivais pas à deviner lequel il voulait. – user7116

4

Vous ne pouvez pas le faire facilement avec une expression de requête - du moins pas sans un effet secondaire horrible. Cependant, vous pouvez facilement le faire avec la notation par points pour Select ou Where. Étant donné que vous avez tout à fait une longue expression de requête, il est probablement plus facile d'intégrer un appel supplémentaire à l'endroit où au début - en supposant que vous réellement voulez l'indice dans l'expression originale de « s »:

var AllSections = 
    from s in xmlDoc.Descendants("section") 
    select new 
    { 
     id = s.Attribute("id").Value, 
     themeTitle = s.Element("themeTitle").Value, 
     themeText = s.Element("themeText").Value, 
     objects = (from a in AllObjects.Select((Item,Index) => new {Item,Index}) 
       join b in s.Item.Descendants("object") 
       on a.Item.Attribute("accessionNumber").Value equals 
        b.Attribute("accessionNumber").Value 
        //select a 
        select new 
        { 
        //index = insert ordinal id/index of element 
        Index = a.Index, 
        ObjectTitle = a.Element("ObjectTitle").Value, 
        ObjectText = a.Element("textentry").Value, 
        } 
       ) 
    }; 

C'est en supposant que vous voulez l'indice de a au sein de AllObjects.

Questions connexes