我使用HtmlAgilityPack
从网站获取爱好项目的数据。我想从销售鞋子的网站上获取鞋子产品编号。
但是我的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未处理。
无法投射类型的对象 'WhereSelectEnumerableIterator`2 [HtmlAgilityPack.HtmlNode,System.String]' 输入'System.IConvertible'。
答案 0 :(得分: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);
答案 1 :(得分:0)
假设只有一个条目与您的查询匹配,您只需要修改它以使用FirstOrDefault()或First():
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);
}
请记住,如果该项目不存在,上述内容将失败,并出现例外情况。
答案 2 :(得分:0)
您的查询不返回单个结果,而是返回结果列表。在您的情况下,这将是一个包含单个ID的列表。您应该将其修改为:
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