Или вы можете на последнем шаге привести XElement и использовать все, что может предложить XElement:
вместо var q:
IEnumerable<XElement> q =from c in loaded.Descendants("module")
where (int)c.Attribute("ModuleID").Value < 0
select c;
foreach(XElement e in q){
string t = e.Attribute("Text").Value;
// etc...
}
если вы знаете, что одна запись будет возвращена
XElement q = (from c in loaded.Descendants("module")
where (int)c.Attribute("ModuleID").Value < 0
select c).First(); // one of many options to return a single record
sring t = q.Attribute("Text").Value;
// etc...
UPDATE
для дальнейших запросов к вашему результату:
IEnumarble<XElement> menus = q.Elements("menu");
затем цикл foreach, вы можете использовать menuselement.Element("tag_name").Value
, чтобы получить строковые значения узлов, или menuselement.Attribute("attr_name").Value
, чтобы получить значения атрибутов, и вы можете дополнительно запросить с помощью menuslement.Find или menuselement.Where
или menuselement.Select
и параметров действительно безграничны ... вот где вы можете узнать больше:
http://msdn.microsoft.com/en-us/library/bb387065.aspx
А вот MSDN как запросить xml с помощью linq:
http://msdn.microsoft.com/en-us/library/bb943906.aspx