¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
¡Acceso ilimitado 24/7 a todos nuestros libros y vídeos! Descubra la Biblioteca Online ENI. Pulse aquí
  1. Libros
  2. C# 10
  3. Presentación de LINQ
Extrait - C# 10 Desarrolle aplicaciones Windows con Visual Studio 2022
Extractos del libro
C# 10 Desarrolle aplicaciones Windows con Visual Studio 2022
4 opiniones
Volver a la página de compra del libro

Presentación de LINQ

Las consultas LINQ

LINQ (Language INtegrated Query) ofrece una sintaxis de consultas al lenguaje C#. Es posible acceder a las diferentes fuentes de datos usando una única sintaxis, gracias al nivel de abstracción que proporciona.

El espacio de nombres System.Linq se debe especificar entre las cláusulas using.

1. La sintaxis

Una consulta LINQ utiliza palabras clave predefinidas como from, where, orderby o select para extraer los datos de una colección de objetos:

var query = from ms in _db.MailServers  
            where ms.Host == "mail.midominio.com"  
            orderby ms.Username  
            select ms; 

La consulta anterior devuelve una lista de objetos de tipo MailServer que tienen el valor mail.midominio.com como valor en la propiedad Host y ordena el resultado según el valor de la propiedad Username.

Una consulta LINQ debe empezar por la cláusula from y terminar por la cláusula select o group. Entre estas dos cláusulas de inicio y fin, opcionalmente, puede tener cláusulas where, orderby o join, entre otras, así como cláusulas from adicionales.

La variable query contiene únicamente la consulta LINQ que se le asigna. La consulta no se ejecuta en el momento de la asignación, sino cuando se accede a la variable en un bucle foreach:

foreach (MailServer...

Los operadores de consultas

La clase Enumerable define varios métodos que permiten construir consultas LINQ. Cada consulta tiene su equivalente en forma de palabra clave, que permite construir consultas LINQ sin hacer llamadas a los métodos.

1. Filtrar

a. Where

El método Where permite combinar expresiones booleanas, como en una consulta SQL:

IEnumerable<Entities.MailServer> mailServers = _db.MailServers  
                .Where(ms => ms.Host == "mail.midominio.com")  
                .Select(ms => ms); 

La consulta LINQ equivalente es la siguiente:

var query = from ms in _db.MailServers  
            where ms.Host == "mail.midominio.com"  
            select ms; 

Una sobrecarga del método Where permite pasar como segundo argumento el índice. Este índice está disponible para cada resultado devuelto, por lo que se puede usar en la expresión booleana:

IEnumerable<Entities.MailServer> mailServers = _db.MailServers  
                .Where((ms, index) =>   
                    ms.Host == "mail.midominio.com"  
                    && index < 2)  
                .Select(ms => ms); 

b. OfType<TResult>

El método OfType<TResult> permite crear un filtro sobre el tipo del objeto:

IEnumerable<Entities.MailServer> mailServers = _db.MailServers  
                .OfType<Entities.MailServer>()  
                .Select(ms => ms); 

c. SelectMany

El método SelectMany permite seleccionar los objetos a partir de varias fuentes y el filtro se puede hacer sobre estas mismas fuentes:

var mailServers = _db.MailServers  
                .SelectMany(ms => ms.Sender,  
                (ms, s) => new { mailServer = ms, sender = s })  
                .Where(ms => ms.sender.Name...

Las consultas paralelas

El Framework .NET proporciona la nueva clase ParallelEnumerable en el espacio de nombres System.Linq. Permite repartir las consultas en varias tareas para mejorar su rendimiento.

El beneficio respecto al rendimiento de las consultas paralelas es particularmente visible con las tablas, listas o cualquier tipo de colecciones de gran tamaño. La máquina que ejecuta la aplicación también debe tener varios procesadores, de manera que la carga se reparta. Las mejoras no son visibles con una máquina mono procesador.

Para ilustrar las consultas paralelas cree una lista grande con valores aleatorios:

int size = 150000000;  
List<Int64> list = new List<Int64>(size);  
Random rand = new Random();  
for (int i = 0; i < size; i++)  
{  
    list.Add(rand.Next(20));  
} 

Ahora añada la instrucción que permite calcular el valor medio de todos los valores de la lista:

double avg = list.AsParallel()  
                 .Where(i => i > 10)  
                 .Select(i => i).Average(); 

La consulta LINQ equivalente es la siguiente:

double avg = (from i in list.AsParallel()  
              where i > 10  
           ...