Introducción a LINQ

Si utilizas c# quizás deberías implementar el uso de LINQ para el manejo de colecciones

Es una herramienta para estandarizar la forma en que trabajas con los datos sin importar el origen, puede ser SQL, XML, etc.

Mediante LINQ puedes realizar los distintos tipos de consultas, como seleccionar filtrar, ordenar, unir,agrupar.

Una de las ventajas es que puedes evitar utilizar un bucle para obtener la información que necesitas.


Por ejemplo: Para obtener los valores de un array mayores a 80, sin LINQ lo podemos hacer de la siguiente manera:

int[] scores = [97, 92, 81, 60];
  
List<int> above80 = [];

foreach (var item in scores)
{
	if (item > 80)
	above80.Add(item);
}

foreach (var item in above80)
{
	Console.Write(item + " ");
}

Implementado LINQ

int[] scores = [97, 92, 81, 60];

IEnumerable<int> above80 =
from score in scores
where score > 80
select score;

foreach (var i in above80)
{
	Console.Write(i + " ");
}

Lo que estamos haciendo es:

  1. Crear un alias para el objeto dentro de la colección score in scores
  2. Especificamos el filtro para nuestra consulta where score > 80
  3. Seleccionamos los datos para retornar (en este caso es el valor en si, pero si fuera un objecto seleccionarías las columnas que quieres en tu consulta) select score

Con esto ya tenemos los elementos que necesitamos en nuestra variable above80

Sintaxis de Consulta y Sintaxis de Método

Tienes dos opciones para escribir consultas de LINQ, la primera es la que vimos en el ejemplo de arriba, es una sintaxis que es similar a escribir una consulta SQL. La segunda opción es utilizar la sintaxis de métodos,esta se apoya del uso de expresiones lambda(por ejemplo en un Where(x=> filtro) utilizas una función anónima para filtrar según lo que necesites). Puedes realizar las mismas operaciones con ambas sintaxis, la elección queda a preferencia del desarrollador

algunas personas dicen que para joins complejos les es mejor utilizar la sintaxis de consulta

Comparación de sintaxis

int[] scores = [97, 92, 81, 60];
  

IEnumerable<int> above80Query =
from score in scores
where score > 80
select score;

IEnumerable<int> above80Method = scores.Where(x => x > 80);

LINQ is Lazy

Algo a tomar en consideración es que las consultas de de LINQ tienen una ejecución diferida, es decir la consulta no se realiza hasta que utilicemos el resultado. En la documentación de Microsoft se especifica que esto se realiza de esa forma para mejorar el rendimiento cuando se trabaje con colecciones grandes.

Por ejemplo:

int[] scores = [97, 92, 81, 60];

IEnumerable<int> above80 = scores.Where(x => x > 80);

Console.WriteLine("Count" + above80.Count()); // Muestra 3

scores[1] = 50;

//Solo muestra 97 y 81
foreach (var i in above80)
{
	Console.Write(i + " ");
}

Consultamos los scores mayores a 80 (que serian 97, 92, 81) y son los valores que están en nuestra variable above80

Pero si realizamos un cambio antes de solicitar el resultado de la consulta

scores[1] = 50;

Nuestro resultado final se vera afectado puesto que en ese momento es en el que se ejecuta la consulta

//Solo muestra 97 y 81
foreach (var i in above80)
{
	Console.Write(i + " ");
}

Que aprendí..

← Volver al inicio