linq查询必须返回一个字符串

时间:2013-09-18 14:02:15

标签: c# linq

我使用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'。

3 个答案:

答案 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