Ayuda de LinQ To XML con Sum, Count, Min y Max

11/10/2008 - 21:33 por edcha | Informe spam
Como veran estoy aprendiendo esto de LinQ To XML
Tengo el siguiente archivo XML

<?xml version="1.0" encoding="iso-8859-1" standalone="yes"?>
<!--A sample xml file-->
<employees>
<employee id="1" salaried="false">
<horas>150</horas>
<name>Gustavo Achong</name>
<hire_date>7/31/1996</hire_date>
</employee>
<employee id="2" salaried="true">
<horas>200</horas>
<name>Kim Abercrombie</name>
<hire_date>12/12/1997</hire_date>
</employee>
</employees>

Lo cargo asi

string dirXml = System.AppDomain.CurrentDomain.BaseDirectory +
"Reg.xml";
XElement xEleLoad = XElement.Load(dirXml);


Para cargar el archivo tengo esta consulta con LinQ

var nomPer = from nomElement in xEleLoad.Descendants("employee")
where nomElement.Element("name").Value == "Carla Adams"
orderby (string)nomElement.Element("name")
let fullName = (string)nomElement.Element("name") +
" " + DateTime.Parse(nomElement.Element("hire_date").Value).Date
select new {
ID = (int)nomElement.Attribute("id"),
FullName = fullName,
Name = (string)nomElement.Element("name"),
Year = (DateTime)nomElement.Element("hire_date"),
};

Pero el asunto es que no se como incluir en la parte de "select" los
Sum, Count, Min y Max
lo que quiero saber es si se puede hacer eso de tal manera que tenga
varias variables con cada una de ellas


hasta el momento solo lo he podido hacer de la siguiente forma y
tendria que hacaer una consulta para varios SUM

var maxHoras = xEleLoad.Descendants("employee")
.Sum(varEle => (int)varEle.Attribute("id"));

¿Como puedo evitar hacer varias consultas como en el segundo ejemplo y
en una sola consulta hacer todo lo que quiero?

Muchas Gracias Por La Ayuda

Edcha
 

Leer las respuestas

#1 Octavio Hernandez
12/10/2008 - 12:22 | Informe spam
Hola,

var maxHoras = xEleLoad.Descendants("employee")
.Sum(varEle => (int)varEle.Attribute("id"));

¿Como puedo evitar hacer varias consultas como en el segundo ejemplo y
en una sola consulta hacer todo lo que quiero?





Simplemente utiliza un bucle foreach:

int totalHoras = 0;
decimal totalSalario = 0.0M;
foreach (var p in xEleLoad.Descendants("employee"))
{
totalHoras += (int) p.Element("horas");
totalSalario += (decimal) p.Element("salario");
};

Los operadores Sum, Average, etc. se "tragan" toda la secuencia de entrada y
no son encadenables (devuelven un escalar), por lo que necesitarías varios
recorridos de la secuencia original para obtener todos los acumulados que
necesitas.

Este post te podría resultar interesante:
http://geeks.ms/blogs/ohernandez/ar...t-gt.aspx.

Slds - Octavio

Preguntas similares