1

我正在尝试在 xml 文件中查询搜索词的两个属性。

我有这个:

<?xml version="1.0" encoding="utf-8" ?>
<Products>
  <item ProductName="Golf Shirt" Content="This is a nice breathable shirt for golf." />
  <item ProductName="Bowling Ball" Content="This is a colorful 8-lbs ball." />
  <item ProdcutName="Tee Shirt" Content="100% cotton tee-shirt." />
</Products>

我想查询搜索词的 ProductName 和 Content 属性值。

这是我的查询表达式:

var results = from node in _xDoc.Descendants("Item")
    where node.Attribute("Content").Value.Contains(searchTerm)
    where node.Attribute("ProductName").Value.Contains(searchTerm)
    select new SearchModel()
    {
    Name = node.Attribute("ProductName").Value,
    Url = "the url",
    Group = "Products"
    };

如果我的搜索词是“衬衫”,我应该返回“高尔夫衬衫”和“T 恤”,但我什么也得不到。我认为这是因为双重“where”子句正在创建和“and”表达式,我需要一个“or”表达式。如果我删除其中一个“where”子句,它就会起作用。

我试着放一个“||” 在第一个“where”子句之后,但这会产生错误。

如何为 Linq-to-Xml 实现“或 where”子句?

谢谢。

4

2 回答 2

0

你有没有尝试过这样的事情:

where ((string)node.Attribute("Content")).Contains(searchTerm) || ((string)node.Attribute("ProductName")).Contains(searchTerm)

?

于 2012-06-07T22:48:42.927 回答
0

我想到了。这是我的解决方法。

var results = _xDoc.Descendants("Item")
    .Where(c => 
        (
            c.Attribute("ProductName").Value.ToLower().Contains(searchTerm.ToLower()) ||
            c.Attribute("Content").Value.ToLower().Contains(searchTerm.ToLower())
        )
     )
    .Select(c => new SearchModel()
         {
             Name = c.Attribute("ProductName").Value,
             Url = "the url",
             Group = "Products"
         });
于 2012-06-07T23:03:32.903 回答