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.
Aprende CSharp GRATIS y certifícateLINQ (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:
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.
Expresiones lambda: LINQ usa estas expresiones para formar la lógica de las consultas.
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.
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.
Excepciones
Operadores
Control de flujo
Polimorfismo
Funciones
Arrays y listas
Variables y constantes
Diccionarios
Variables y constantes
Constructores y destructores
Clases y encapsulación
Polimorfismo
Eventos
Operadores
LINQ
Lambdas
Excepciones
Objetos
Conjuntos, colas y pilas
Tipos de datos
Tipos de datos
Tareas
Diccionarios en C#
Funciones
Funciones
Constructores y destructores
Constructores y destructores
Delegados
Herencia C Sharp
Uso de consultas LINQ
Excepciones
Lambdas
Conjuntos, colas y pilas
Introducción a C#
Diccionarios
Uso de async y await
Tipos de datos
Clases y objetos
Creación de proyecto C#
Herencia
Uso de consultas LINQ
Arrays y listas
Herencia de clases
Clases y encapsulación
Operadores
Arrays y listas
Uso de async y await
Control de flujo
OOP en C Sharp
CRUD en C# de modelo Customer sobre una lista
Objetos
Control de flujo
Tareas
Variables y constantes
Delegados
Eventos
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.
Introducción A C#
Sintaxis
Creación De Proyecto C#
Sintaxis
Variables Y Constantes
Sintaxis
Tipos De Datos
Sintaxis
Operadores
Sintaxis
Control De Flujo
Sintaxis
Funciones
Sintaxis
Clases Y Encapsulación
Programación Orientada A Objetos
Objetos
Programación Orientada A Objetos
Constructores Y Destructores
Programación Orientada A Objetos
Herencia
Programación Orientada A Objetos
Polimorfismo
Programación Orientada A Objetos
Excepciones
Excepciones
Arrays Y Listas
Colecciones Y Linq
Diccionarios
Colecciones Y Linq
Conjuntos, Colas Y Pilas
Colecciones Y Linq
Uso De Consultas Linq
Colecciones Y Linq
Delegados
Programación Asíncrona
Eventos
Programación Asíncrona
Lambdas
Programación Asíncrona
Uso De Async Y Await
Programación Asíncrona
Tareas
Programación Asíncrona
En esta lección
Objetivos de aprendizaje de esta lección
- Comprender el concepto de LINQ y su utilidad en la manipulación de datos en C#.
- Conocer los componentes principales de LINQ: operadores de consulta, expresiones lambda y proveedores.
- Aprender las dos formas de sintaxis de LINQ: sintaxis de método y sintaxis de consulta.
- Familiarizarse con las operaciones básicas y avanzadas de LINQ, como filtrado, proyección, ordenación, agrupamiento y agregación.
- Saber cómo aplicar LINQ para facilitar la escritura de código más limpio y mantenible.