2009-05-19 14 views
0

Neu bei Linq, versuchen, ein XDocument abzufragen. Ich möchte Elemente, bei denen ein bestimmtes Attribut einem von zwei Werten entspricht.Linq-to-XML: Abfrage Bereinigung

der Suche nach Anregungen, wie diese Abfrage zu optimieren:

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

Vielen Dank für alle Ideen.

Antwort

0

Eigentlich sind Sie ganz gut im Gange, aber man kann es ein wenig (ungetestet) rationalisieren:

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

Die wichtigsten Unterschiede sind die let Schlüsselwort, das eine neue Variable in der Abfrage und der Tatsache führt, dass Sie vergleichen können Strings mit dem Operator == seit System.String implementiert diesen Operator.

+0

Viel besser, und ich lernte über das Schlüsselwort lettet ... Verhält sich "Let" wie "var", wo die Variable ihren Typ von der RH bekommt? Danke für die Antwort. – Number8

+0

Ja, verhält sich wie Var –