Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Una de las ventajas más importantes de LINQ (y LINQ to XML) es que las consultas encadenadas funcionan igual de bien que una sola consulta más grande y complicada.
Una consulta encadenada es una consulta que usa otra consulta como su origen.Por ejemplo, en el siguiente código simple, query1 es el origen de query2:
XElement root = new XElement("Root",
new XElement("Child", 1),
new XElement("Child", 2),
new XElement("Child", 3),
new XElement("Child", 4)
);
var query1 = from x in root.Elements("Child")
where (int)x >= 3
select x;
var query2 = from e in query1
where (int)e % 2 == 0
select e;
foreach (var i in query2)
Console.WriteLine("{0}", (int)i);
Este ejemplo genera el siguiente resultado:
4
Esta consulta encadenada proporciona el mismo perfil de rendimiento que si se recorriese en iteración una lista vinculada.
El eje Elements tiene básicamente el mismo rendimiento que si se recorriese en iteración una lista vinculada.Elements se implementa como iterador con ejecución aplazada.Es decir, realiza trabajo adicional además de recorrer en iteración la lista vinculada, como asignar el objeto iterador y mantener el seguimiento del estado de la ejecución.Este trabajo se puede dividir en dos categorías: el trabajo que se realiza cuando se configura el iterador y el que se lleva a cabo durante cada iteración.El trabajo de configuración es un trabajo mínimo y fijo, mientras que el realizado durante cada iteración es proporcional al número de elementos de la colección de origen.
En query1, la cláusula where provoca la llamada al método Where por parte de la consulta.Este método también se implementa como iterador.El trabajo de configuración está formado por la creación de una instancia del delegado que hará referencia a la expresión lambda, más la configuración normal de un iterador.Con cada iteración, se llama al delegado para que ejecute el predicado.El trabajo de configuración y el realizado durante cada iteración es parecido al llevado a cabo mientras se recorre en iteración el eje.
En query1, la cláusula Select provoca la llamada al método Select por parte de la consulta.Este método tiene el mismo perfil de rendimiento que el método Where.
En query2, tanto la cláusula where como la cláusula select tienen el mismo perfil de rendimiento que en query1.
Por lo tanto, la iteración por query2 es directamente proporcional al número de elementos del origen de la primera consulta, es decir, tiempo lineal.Un ejemplo de Visual Basic correspondiente tendría el mismo perfil de rendimiento.
Para obtener más información sobre iteradores, vea yield (Referencia de C#).
Para obtener un tutorial más detallado sobre consultas encadenadas, vea Tutorial: encadenar cadenas juntas.