Linq-to-XML: очистка запросов - PullRequest
0 голосов
/ 20 мая 2009

Новичок в Linq, пытаюсь запросить XDocument. Я хочу элементы, где определенный атрибут равен одному из двух значений.

Ищете предложения по оптимизации этого запроса:

query = from xElem in doc.Descendants(StringLiterals._streamNodeName)<br> where ((0 == xElem.Attribute(StringLiterals._typeAttributeName).Value.CompareTo(StringLiterals._sWorkspace)) ||<br> (0 == xElem.Attribute(StringLiterals._typeAttributeName).Value.CompareTo(StringLiterals._sNormal)))<br> select new AccuRevXmlElement<br> {<br> _location = xElem.Attribute(StringLiterals._nameAttributeName).Value,<br> _streamNumber = xElem.Attribute(StringLiterals._streamNumberAttributeName).Value<br> };

Спасибо за любые идеи.

1 Ответ

0 голосов
/ 20 мая 2009

На самом деле у вас все идет хорошо, но вы можете немного его упростить (не проверено):

from xElem in doc.Descendants(StringLiterals._streamNodeName)
let typeAttributeValue = xElem.Attribute(StringLiterals._typeAttributeName).Value
where typeAttributeValue == StringLiterals._sW... ||
      typeAttributeValue == StringLiterals._sNormal
select new AccuRevXmlElement
{
    _location = xElem.Attribute(StringLiterals._nameAttributeName).Value,
    _streamNumber =
        xElem.Attribute(StringLiterals._streamNumberAttributeName).Value
};

Ключевым отличием является ключевое слово let, которое вводит новую переменную внутри запроса, и тот факт, что вы можете сравнивать строки, используя оператор ==, поскольку System.String реализует этот оператор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...