2013-09-18 3 views
1

Я использую HtmlAgilityPack для получения данных с веб-сайта для проекта хобби. Я хочу получить номер статьи обуви с сайта, который продает обувь.Запрос linq должен возвращать строку

Но мой запрос linq не возвращает строку. Вместо этого он возвращает тип:

System.Linq.Enumerable.WhereSelectEnumerableIterator<HtmlAgilityPack.HtmlNode,string> 

Как я могу получить запрос, чтобы просто вернуть строку?

foreach (var node in query) 
{ 
    Shoe shoe = new Shoe(); 

    var num = from x in node.Descendants() 
      where x.Name == "img" && x.Attributes.Contains("class") && x.Attributes["class"].Value == "thumb lazy" 
      select x.Attributes["title"].Value.Substring(11); 

    shoe.articleNumber = Convert.ToInt32(num); //error 

    shoes.Add(shoe); 
} 

Ошибка: InvalidCastException был необработанным.

Unable to cast object of type 'WhereSelectEnumerableIterator`2[HtmlAgilityPack.HtmlNode,System.String]' to type 'System.IConvertible'.

ответ

8

Ваш запрос LINQ возвращает коллекцию. Используйте First/FirstOrDefault/Single/SingleOrDefault получить только один элемент из коллекции:

var num = (from x in node.Descendants() 
      where x.Name == "img" && x.Attributes.Contains("class") && x.Attributes["class"].Value == "thumb lazy" 
      select x.Attributes["title"]).First().Value.Substring(11); 
+0

+1 для перечисления всех четырех вариантов. OP - обратите внимание на разницу между First/Single и First/SingleOrDefault: исключение, отличное от умолчания, если не найдено, а по умолчанию будет возвращено значение по умолчанию для возвращаемого типа. – bland

+0

Это работает и очень понятно. Благодарю. Я знал, что что-то не так, но неправильно попытался изменить node.Descendants на node.FirstOrDefault. –

0

Предполагая, что там только будет одна запись, которая соответствует вашему запросу, вам просто нужно изменить его, чтобы использовать FirstOrDefault() или в первую очередь():

foreach (var node in query) 
{ 
    Shoe shoe = new Shoe(); 

    var num = (from x in node.Descendants() 
     where x.Name == "img" && x.Attributes.Contains("class") && x.Attributes["class"].Value == "thumb lazy" 
     select x.Attributes["title"].Value.Substring(11)).First(); 

    shoe.articleNumber = Convert.ToInt32(num); 

    shoes.Add(shoe); 
} 

Просто имейте в виду, что приведенное выше не будет выполнено с исключением, если элемент отсутствует.

0

Ваш запрос не возвращает ни одного результата, а список результатов. В вашем случае это будет список, содержащий один идентификатор. Вы должны изменить его к этому:

var num = (from x in node.Descendants() 
      where x.Name == "img" && x.Attributes.Contains("class") && x.Attributes["class"].Value == "thumb lazy" 
      select x.Attributes["title"].Value.Substring(11)).FirstOrDefault(); 

Разница между single, singleorDefault ,first ,FirstorDefault Here

Смежные вопросы