Любая идея, почему этот запрос LINQ to XML дает мне повторяющиеся значения? - PullRequest
1 голос
/ 21 марта 2011

Я пытаюсь вернуть список авторов из сообщений в ветке форума, используя запрос LINQ to XML, но запрос возвращает мне одного и того же автора для каждого сообщения.

Запросы работают правильно, когда я делаю их отдельно, как это:

var doc = XDocument.Load("http://us.battle.net/wow/en/forum/topic/2267488434");
XNamespace ns = "http://www.w3.org/1999/xhtml";

var posts = doc.Descendants(ns + "div")
                .Where(a => a.Attribute("id") != null && a.Attribute("id").Value == "thread")
                .Elements(ns + "div");
var authors = posts.Descendants().Where(a => a.Attribute("class") != null && a.Attribute("class").Value == "context-link");

Но когда я пытаюсь выполнить одно и то же действие в одном запросе, я не получаю одинаковые результаты. Ниже мой запрос:

var authors = from td in doc.Descendants(ns + "div")
                            .Where(a => a.Attribute("id") != null && a.Attribute("id").Value == "thread")
                            .Elements(ns + "div")
                let elements = doc.Descendants()
                                .Where(a => a.Attribute("class") != null)
                let author = elements.First(a => a.Attribute("class").Value == "context-link")
                select new
                {
                    Author = author.Value.Trim(),
                };

Есть идеи, что я делаю не так?

1 Ответ

1 голос
/ 21 марта 2011

Вы объявляете td, но никогда не используете его. Я подозреваю, что строка, которая читает

let elements = doc.Descendants()

следует читать let elements = td.Descendants().

Я думаю, что запрос мог бы быть лучше написан как:

var authors =
    from post in doc.Descendants(ns + "div")
    where (string)post.Attribute("id") == "thread"
    select
        (from author in post.Descendants(ns + "div")
         where (string)author.Attribute("class")== "context-link"
         select author.Value.Trim())
        .First();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...