2012-06-07 6 views
1

Я пытаюсь запросить два атрибута в XML-файле для поискового запроса.Linq-to-xml where or clause

У меня есть это:

<?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 и значения атрибутов контента на поисковый запрос.

Вот мое выражение запроса:

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" 
    }; 

Если мой термин поиск «рубашка», я должен вернуться «Golf рубашка» и «майка», но я ничего не получаю. Я думаю, это потому, что создается предложение double where where и выражение «and», и мне нужно выражение «или». Если я удалю одно из предложений «где», это сработает.

Я попробовал поставить «||» после первого предложения where, но это порождает ошибку.

Как реализовать предложение «или где» для Linq-to-Xml?

Спасибо.

ответ

0

Вы пробовали что-то вроде этого:

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

?

+0

Да, я только что понял, и это очень похоже на ваш ответ. – Kahanu

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