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

本文关键字:一个 字符串 查询 返回 LINQ | 更新日期: 2023-09-27 18:31:52

我使用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]' 键入"系统可逆"。

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

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

假设只有一个条目与您的查询匹配,您只需将其修改为使用 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);
}

请记住,如果该项目不存在,上述操作将失败并出现异常。

查询不会返回单个结果,而是返回结果列表。在您的情况下,这将是一个包含单个 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之间的区别这里