CSharp

Tutorial CSharp: Uso de consultas LINQ

CSharp LINQ: consultas y ejemplos. Aprende a realizar consultas en CSharp utilizando LINQ con ejemplos prácticos y detallados.

LINQ (Language Integrated Query) es una de las características más poderosas de C#. Permite a los desarrolladores realizar consultas de datos de una manera más legible y cómoda. El concepto central detrás de LINQ es el de tratar los datos como objetos, permitiendo una integración fluida entre el lenguaje de programación y las operaciones de consulta de datos.

LINQ ofrece una sintaxis de consulta consistente en C# para manipular datos, independientemente de la fuente de datos, sea en memoria, en una base de datos o desde un servicio web.

LINQ se encuentra en el namespace System.Linq.

using System.Linq;

Componentes principales de LINQ

Hay tres componentes principales en LINQ:

  1. Operadores de consulta estándar: estos son los métodos que se usan para crear consultas de LINQ. Los métodos más comunes son Select, Where, OrderBy, GroupBy, Join, etc.

  2. Expresiones lambda: LINQ usa estas expresiones para formar la lógica de las consultas.

  3. Proveedores de LINQ: son las implementaciones específicas de LINQ para una determinada fuente de datos. Los proveedores más comunes son LINQ to Objects, LINQ to SQL, LINQ to XML, etc.

Sintaxis de LINQ

Hay dos formas de sintaxis en LINQ: sintaxis de método y sintaxis de consulta.

Sintaxis de método

En la sintaxis de método, se usan los operadores de consulta estándar y las expresiones lambda para escribir consultas LINQ. A continuación se muestra un ejemplo de código:

List<int> numeros = new List<int>() { 1, 2, 3, 4, 5 };

IEnumerable<int> numerosFiltrados = numeros.Where(n => n > 2);
// 3, 4, 5

En el ejemplo anterior, Where es un operador de consulta estándar y n => n > 2 es una expresión lambda que filtra los números mayores que 2.

La mayoría de consulas en LINQ devuelven el tipo IEnumerable, que es una interfaz que representa una secuencia de elementos que se pueden recorrer. LINQ proporciona el método ToList() que permite convertir un IEnumerable en lista.

List<int> listaFiltrada = numerosFiltrados.ToList();

Esto podría hacerse en una línea:

List<int> numeros = new List<int>() { 1, 2, 3, 4, 5 };

List<int> numerosFiltrados = numeros.Where(n => n > 2).ToList();

Sintaxis de consulta

En la sintaxis de consulta, se utilizan las palabras clave de consulta de LINQ para formar la consulta. Aquí hay un ejemplo equivalente a la consulta anterior usando la sintaxis de consulta:

List<int> numeros = new List<int>() { 1, 2, 3, 4, 5 };

IEnumerable<int> numerosFiltrados = from n in numeros
                                    where n > 2
                                    select n;

En el ejemplo anterior, from, where y select son palabras clave de consulta de LINQ. La consulta es bastante legible: selecciona los números de la lista de números donde el número es mayor que 2.

Proyección y filtrado

En LINQ, la proyección se refiere a la operación de seleccionar un subconjunto de los datos. La filtración es la operación de eliminar los datos que no cumplen con una cierta condición.

Aquí hay un ejemplo de proyección y filtrado usando la sintaxis de consulta, asumiendo una clase Student que contenga propiedades Name y Score:

List<Student> students = GetStudents();

var highScoreStudents = from s in students
                        where s.Score > 90
                        select new { s.Name, s.Score };

foreach (var student in highScoreStudents)
{
    Console.WriteLine("Name: {0}, Score: {1}", student.Name, student.Score);
}

En este ejemplo, se selecciona un subconjunto de estudiantes (s.Name, s.Score) que tienen una puntuación mayor que 90.

El equivalente con sintaxis de método es el operador Where(), que es el operador de consulta estándar en LINQ.

Por otro lado, la operación Select() se utiliza para proyectar cada elemento de una secuencia original en un nuevo elemento basado en una función o transformación definida por una expresión lambda. En otras palabras, Select() permite realizar una transformación en cada elemento de la secuencia y crear una nueva secuencia con los elementos resultantes.

int[] numeros = { 1, 2, 3, 4, 5 };

IEnumerable<int> cuadrados = numeros.Select(x => x * x);
// 1, 4, 9, 16, 25

Operaciones de conjunto

LINQ también soporta operaciones de conjunto como Unión, Intersección y Diferencia.

Aquí hay un ejemplo de estas operaciones:

List<int> set1 = new List<int>() { 1, 2, 3, 4, 5 };
List<int> set2 = new List<int>() { 4, 5, 6, 7, 8 };

IEnumerable<int> union = set1.Union(set2);
// union: 1, 2, 3, 4, 5, 6, 7, 8
IEnumerable<int> intersect = set1.Intersect(set2);
// intersect: 4, 5
IEnumerable<int> difference = set1.Except(set2);
// difference: 1, 2, 3

En este ejemplo, la Union da todos los elementos únicos en ambos conjuntos, la Intersect da los elementos comunes a ambos conjuntos y la Except da los elementos que están en el primer conjunto pero no en el segundo.

Otras operaciones

Además de las operaciones básicas de filtrado, selección y operaciones de conjunto, LINQ proporciona una gran variedad de operaciones adicionales para trabajar con colecciones de datos. Aquí se detallan algunas de las más utilizadas:

Ordenación

LINQ ofrece las operaciones OrderBy y OrderByDescending para ordenar los datos. Aquí hay un ejemplo de cómo se podrían usar estas operaciones:

List<int> numeros = new List<int>() { 5, 3, 1, 4, 2 };

IEnumerable<int> ordenAscendente = numeros.OrderBy(n => n);
// 1, 2, 3, 4, 5
IEnumerable<int> ordenDescendente = numeros.OrderByDescending(n => n);
// 5, 4, 3, 2, 1

Agrupamiento

La operación GroupBy se utiliza para agrupar los elementos de una colección basándose en una clave específica. Aquí hay un ejemplo:

List<Student> estudiantes = ObtenerEstudiantes();

var estudiantesPorGrado = estudiantes.GroupBy(e => e.Grado);

foreach (var grupo in estudiantesPorGrado)
{
    Console.WriteLine("Grado: {0}", grupo.Key);

    foreach (var estudiante in grupo)
    {
        Console.WriteLine("\t{0}", estudiante.Nombre);
    }
}

Agregación

Las operaciones de agregación, como Count, Sum, Average, Min y Max, se utilizan para calcular un solo valor a partir de una colección. Aquí hay un ejemplo de estas operaciones:

List<int> numeros = new List<int>() { 3, 4, 1, 2, 5 };

int count = numeros.Count(); // Cantidad: 5
int sum = numeros.Sum(); // Suma: 15
double average = numeros.Average(); // Media: 3
int min = numeros.Min(); // Menor: 1
int max = numeros.Max(); // Mayor: 5

Elemento único

Las operaciones First, FirstOrDefault, Last, LastOrDefault, ElementAt y ElementAtOrDefault se utilizan para recuperar un único elemento de una colección. Por ejemplo:

List<int> numeros = new List<int>() { 3, 4, 1, 2, 5 };

int primerElemento = numeros.First(); // 3
int ultimoElemento = numeros.Last(); // 5
int segundoElemento = numeros.ElementAt(1); // 4

Si estos métodos no encuentran ningún elemento apropiado, lanzarán una InvalidOperationException. Las versiones OrDefault de estos métodos difieren en que si no encuentran ningún elemento apropiado, no lanzarán ningún error sino que devolverán el valor por defecto para ese tipo de dato (como 0 para un int, una cadena vacía para un string, o null para un objeto).

Todas estas operaciones facilitan el manejo de colecciones de datos en C#, lo que permite escribir código más limpio y mantenible.

Conclusión

LINQ es una herramienta poderosa y flexible en C# que permite manipular datos de diversas fuentes de manera uniforme y legible. Proporciona una amplia gama de operaciones y facilita la escritura de código más limpio y mantenible.

Certifícate en CSharp con CertiDevs PLUS

Ejercicios de esta lección Uso de consultas LINQ

Evalúa tus conocimientos de esta lección Uso de consultas LINQ con nuestros retos de programación de tipo Test, Puzzle, Código y Proyecto con VSCode, guiados por IA.

Todas las lecciones de CSharp

Accede a todas las lecciones de CSharp y aprende con ejemplos prácticos de código y ejercicios de programación con IDE web sin instalar nada.

En esta lección

Objetivos de aprendizaje de esta lección

  1. Comprender el concepto de LINQ y su utilidad en la manipulación de datos en C#.
  2. Conocer los componentes principales de LINQ: operadores de consulta, expresiones lambda y proveedores.
  3. Aprender las dos formas de sintaxis de LINQ: sintaxis de método y sintaxis de consulta.
  4. Familiarizarse con las operaciones básicas y avanzadas de LINQ, como filtrado, proyección, ordenación, agrupamiento y agregación.
  5. Saber cómo aplicar LINQ para facilitar la escritura de código más limpio y mantenible.