2010-03-30 5 views
1

je le code suivant et me suis devenu confus:LINQ groupe par revenir nouveaux XElements

J'ai une requête qui renvoie un ensemble d'enregistrements qui ont été identifiés comme des doublons et je veux ensuite créer un XElement pour chacun. Cela devrait être fait dans une requête je pense mais je suis maintenant perdu.

var f = (from x in MyDocument.Descendants("RECORD") 
           where itemsThatWasDuplicated.Contains((int)x.Element("DOCUMENTID")) 
           group x by x.Element("DOCUMENTID").Value into g 
           let item = g.Skip(1) //Ignore first as that is the valid one 
           select item 
          ); 

var errorQuery = (from x in f 
           let sequenceNumber = x.Element("DOCUMENTID").Value 
           let detail = "Sequence number " + sequenceNumber + " was read more than once" 
           select new XElement("ERROR", 
              new XElement("DATETIME", time), 
              new XElement("DETAIL", detail), 
              new XAttribute("TYPE", "DUP"), 
              new XElement("ID", x.Element("ID").Value) 
             ) 
          ); 

Répondre

0

J'ai réussi à obtenir ce pour compiler et semble pour travailler mais peut-être il y a quelques ajustements de performance nécessaires ou je fais quelque chose d'inefficace. Qu'est-ce que tu penses?

errorQuery = MyDocument.Descendants("RECORD") 
         .Where(x => itemsThatWasDuplicated.Contains((int)x.Element("DOCUMENTID"))) 
         .GroupBy(a => a.Element("DOCUMENTID"), (innerID, values) => values.OrderBy(b => b.Element("ID").Value)) 
         .Skip(1) 
         .SelectMany(p => p) 
         .Select(item => new XElement("ERROR", 
              new XElement("DATETIME", time), 
              new XElement("DETAIL", "Sequence number " + item.Element("DOCUMENTID").Value + " was read more than once"), 
              new XAttribute("TYPE", "DUP"), 
              new XElement("ID", item.Element("ID").Value) 
             )); 
2

x, par itération, est la séquence d'éléments (à l'exclusion du premier). Je suppose que vous voulez:

from grp in f 
from x in grp 
let sequenceNumber = x.Element("DOCUMENTID").Value 
//... 

Bien que vous pouvez également amener le groupe clé dans la projection si vous voulez, en simplifiant davantage:

var f = (from x in MyDocument.Descendants("RECORD") 
      where itemsThatWasDuplicated.Contains((int)x.Element("DOCUMENTID")) 
      group x by x.Element("DOCUMENTID").Value); 

    var errorQuery = (from grp in f 
         from x in grp.Skip(1) 
         let detail = "Sequence number " + grp.Key + " was read more than once" 
    //...