Использование LINQ Group By для возврата новых XElements - PullRequest
1 голос
/ 30 марта 2010

У меня есть следующий код, и я запутался:

У меня есть запрос, который возвращает набор записей, которые были идентифицированы как дубликаты, и затем я хочу создать XElement для каждого. Я думаю, это должно быть сделано одним запросом, но теперь я потерялся.

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)
                                          )
                             );

Ответы [ 2 ]

2 голосов
/ 30 марта 2010

x за каждую итерацию - последовательность элементов (исключая первый).Я подозреваю, что вы хотите:

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

Хотя вы также можете вывести групповой ключ в проекции, если хотите, упростив далее:

    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"
    //...
0 голосов
/ 30 марта 2010

Мне удалось заставить это скомпилировать и, кажется, работает, но, возможно, есть некоторые изменения производительности, или я делаю что-то неэффективное. Что ты думаешь?

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)
                                          ));
...