Existe en C# una característica increíblemente útil a la hora de filtrar y consultar conjuntos de datos, y que para mi es imprescindible conocer y saber usar medianamente bien si queremos ser desarrolladores productivos y esta característica es LINQ. LINQ viene de Language INtegrated Query y es una extensión del lenguaje que nos permite ejecutar consultas sobre cualquier objeto que implemente la interfaz IEnumerable<T>. Con esto ganamos muchísima claridad a la hora de filtrar colecciones, ya que podemos prescindir de bucles llenos de condiciones a la hora de realizar el filtrado.

LINQ o SQL en el lenguaje

Una de las mejores cosas de LINQ es que nos deja elegir como usarlo, si bien usando sus métodos de extensión o bien usando la sintaxis con palabras clave. La segunda es mi favorita, ya que el código queda escrito de una manera muy similar a SQL estandar pero totalmente integrado en el lenguaje, con su chequeo de tipos, sus errores en tiempo de compilación y demás ventajas que no tienen otros sistemas de consultas basados en cadenas.

Por ejemplo, supongamos que tenemos una clase modelo así definida:

class Person
{
    public int Id { get; set; }
    public string Firstname { get; set; }
    public string Surname { get; set; }
    public int Age { get; set; }
}

Pongamos que tenemos una lista que contiene varios objetos de tipo Person, y queremos sacar todos los mayores de 18 años. Tan simple como esto:

IList<Person> persons = new List<Person>();
// Código que rellena la lista
var oldies = from p in persons where p.Age >= 18 select p;

También podemos escribirlo con métodos de extensión de manera más simplificada, tal que así:

var oldies = persons.Where(p => p.Age >= 18);

El resultado es exactamente el mismo (de hecho, creo que la primera fórmula luego es traducida a la segunda a la hora de compilar) por lo que da igual el estilo que elijamos, será una cuestión de gustos. A mi personalmente me gusta más la sintaxis con palabras clave pues me parece que el código queda increiblemente limpio y entendible.

Lo mejor de LINQ es que es muy potente, y podemos realizar toda clase de consultas, desde un simple select a un complejo outter join, además de contar con funciones de agrupación y agregación. Por ejemplo, la siguiente consulta selecciona las personas mayores de edad y selecciona sus nombres, que luego ordena en orden alfabéticamente ascendente:

var oldies = from p in persons where p.Age >= 18 orderby p.Firstname ascending select p.Firstname;

Proveedores de LINQ: LINQ to Objects, LINQ to XML y más

Existen varios "proveedores" de LINQ que nos permiten usar las características de consulta sobre diferentes fuentes de datos. El proveedor por defecto (LINQ to Objects) solo sirve para consultar colecciones en memoria, pero usando los proveedores podremos ejecutar consultas sobre DataSets que provengan de una base de datos SQL, documentos XML que son convertidos a colecciones de objetos XElement y demás. Tenéis una lista bastante completa de proveedores de LINQ en el artículo de Wikipedia sobre LINQ. A mayores, os recomiendo un artículo que encontré hace un tiempo, y se ha convertido en mi biblia de LINQ, donde podréis ver como realizar cualquier tipo de consulta LINQ, tanto con la sintaxis de palabras clave como con el uso de métodos de extensión.