LINQ con C#. Ejemplos

Sep 7, 2011 Programacion Tutoriales C# 4 comentarios

Casi todas las aplicaciones medianamente serias, necesitarán en algún momento acceder y consultar una base de datos, para luego convertir estos datos en objetos y trabajar con ellos.

Pues bien, si ya llevas algún tiempo programando, habrás notado que esto de extraer los datos de la fuente de datos y tratarlos como objetos es algo complicado, sobre todo porque existen buenas diferencias entre las bases de datos relacionales y los lenguajes orientados a objetos como C#.

Se han diseñado unas cuantas herramientas ORM (Object-Relational mapping) para resolver este problema (crear una base de datos orientada a objetos virtual), pero casi siempre dejan algo que desear, y hoy por hoy, a pesar de haber unas cuantas herramientas de uso libre y comercial, muchos programadores prefieren usar sus propias bibliotecas para trabajar con fuentes de datos.

En este contexto es que nace la idea de LINQ (Language INtegrated Query), en principio una herramienta más para dar solución al problema del mapeo objeto-relacional (ORM) y simplificar la interacción entre objetos y fuentes de datos (XML, ADO.Net, RDBMS), quién luego se convirtió en un conjunto de herramientas de consulta integrado en varios lenguajes de la plataforma .Net.

LINQ es un cambio en la forma de manejar y manipular los datos, permite el acceso a cualquier fuente de datos (LINQ to Objects, LINQ to SQL, LINQ to DataSets), mezclar datos de diferentes fuentes con una sintaxis muy sencilla, comprobar en tiempo de compilación las consultas, el uso de IntelliSense de Visual Studio y un enfoque declarativo para escribir códigos más cortos y sencillos. Funciona a partir de C# 3.0 y VB.Net 9.0 ya que requiere de ayuda por parte del compilador.

En realidad LINQ lo que provee es una capa intermedia entre la fuente de dato y el cliente, por decirlo de alguna forma. Gracias a esta abstracción es que podemos trabajar de la misma forma con LINQ sin importar que la fuente de datos sea un archivo XML o una base de datos.

Bueno,  vamos a ver algunos códigos y ejemplos de consultas LINQ y su ventaja frente a las consultas imperativas que se hacen con C# y a otras.

Nota: Para este ejemplo, vamos a suponer que tenemos ya una base de datos llamada Personal mapeada a un conjunto de clases como sigue. Noten que en muchos casos esto se puede hacer de forma automática con Visual Studio.

Esta sería la estructura de la clase que hace referencia a la base de datos:

[Table(Name="Personas")]
class Persona
{
     [Column(IsPrimaryKey=true)]
      public int ID;
 
     [Column(Name="ContactName")]
      public string Nombre;
 
     [Column(Name="ContactAge")]
      public int Edad;
 
     [Column]
      public string Ocupación;
}

Ahora vamos a obtener todas las personas que tengan menos de 30 años y que sean abogados usando LINQ:

var consulta =
            from persona in db.GetTable()
            where persona.Edad<30 && persona.Ocupacion==”abogado”
            select persona;

Y así ya dejamos de tener que hacer las consultas SQL aquellas que nos complicaban la vida, ahora todo es mucho más sencillo, y podemos mantener las mismas consultas sin importar que fuente de dato se esté usando. En el MSDN hay unos cuantos buenos ejemplos de LINQ. Terminaré con una frase que describe en dos líneas la idea esencial de LINQ:

“Before LINQ it was like you had to order your dinner in one language and drinks in another”
Jason McConnel, Product Manager for Visual Studio at Microsoft

Para seguir leyendo sobre LINQ:

Hoja de Trucos de LINQ to SQL
Ejemplo práctico con LINQ y C#
Tutorial de LINQ to SQL *

Compartir:

4 comentarios

Forma parte de nuestra discusión y síguela de cerca

Buen aporte…

Autor: martin | Fecha: Nov 7, 2011.

Gran aporte, saludos.

Autor: CDFlik | Fecha: Jun 15, 2012.

Buen ejemplo gracias, pero tengo una pregunta para ti
mi consulta linq esta hecha de la siguiente manera:

       var db = new dataContext();

       return db.solicitudes_envio.Select

       (p => new Solicitudes() { 

       nombreCliente = p.sol_nombre_cliente,

       direccionCliente = p.sol_direccion_completa_cliente,

       Comunacliente = p.sol_comuna_cliente

       });
 

Todo esto me resulta de maravilla, el tema es que ahora quiero filtrar por un campo en mi base de datos llamado ’sol_estado_proceso’

Cuando éste estado sea = ‘01′ ó ‘02′ ó ‘03′ pero no sé como hacerlo.

Si alguien me ayudara estaria agradecido.

Autor: Josue | Fecha: Oct 25, 2012.

@Josue, en realidad estás usando LINQ como métodos extensores. Solo tienes que agregar después del último paréntisis una cláusula Where de la siguiente forma:

return db.solicitudes_envio.Select
       (p => new Solicitudes() { 
       nombreCliente = p.sol_nombre_cliente,
       direccionCliente = p.sol_direccion_completa_cliente,
       Comunacliente = p.sol_comuna_cliente
       }).Where(db.solicitudes_envio.sol_estado_proceso== "01" ||
                    db.solicitudes_envio.sol_estado_proceso== "02" ||
                    db.solicitudes_envio.sol_estado_proceso== "03");

Autor: Tomy | Fecha: Oct 30, 2012.

Escribe tu comentario

Requerido.

Requerido. No público.

Si tienes alguno.