Linq-to-XML: очистка запросов

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

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

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

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


person Number8    schedule 19.05.2009    source источник


Ответы (1)


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

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 реализует этот оператор.

person Ronald Wildenberg    schedule 19.05.2009
comment
Намного лучше, и я узнал о ключевом слове let ... 'let' ведет себя как 'var', где переменная получает свой тип от rhs? Спасибо за ответ. - person Number8; 20.05.2009