Sie sind auf Seite 1von 9

Linq con C#

Primeramente para nuestro ejemplo necesitaremos una base de datos de ejemplo,


el script lo tienen debajo. Es una BD pequea con 3 tablas a modo ilustrativo.

CREATE DATABASE LinqUniversidad;


GO

USE LinqUniversidad
GO
/****** Object: Table [dbo].[Maestros] Script Date: 12/19/2009 09:09:50 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[Maestros](
[IdMaestro] [int] IDENTITY(1,1) NOT NULL,
[Nombres] [varchar](50) NOT NULL,
[Documento] [varchar](25) NOT NULL,
[FechaNacimiento] [datetime] NOT NULL,
CONSTRAINT [PK_Maestros] PRIMARY KEY CLUSTERED
(
[IdMaestro] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
/****** Object: Table [dbo].[Materias] Script Date: 12/19/2009 09:09:50 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[Materias](
[IdMateria] [int] IDENTITY(1,1) NOT NULL,
[Nombre] [varchar](50) NOT NULL,
CONSTRAINT [PK_Materias] PRIMARY KEY CLUSTERED
(
[IdMateria] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
SET ANSI_PADDING OFF
GO
/****** Object: Table [dbo].[MateriasMaestros] Script Date: 12/19/2009 09:09:50
******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[MateriasMaestros](
[IdMateria] [int] NOT NULL,
[IdMaestro] [int] NOT NULL,
CONSTRAINT [PK_MateriasMaestros] PRIMARY KEY CLUSTERED
(
[IdMateria] ASC,
[IdMaestro] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF,
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
/****** Object: ForeignKey [FK_MateriasMaestros_Maestros] Script Date: 12/19/2009
09:09:50 ******/
ALTER TABLE [dbo].[MateriasMaestros] WITH CHECK ADD CONSTRAINT
[FK_MateriasMaestros_Maestros] FOREIGN KEY([IdMaestro])
REFERENCES [dbo].[Maestros] ([IdMaestro])
GO
ALTER TABLE [dbo].[MateriasMaestros] CHECK CONSTRAINT
[FK_MateriasMaestros_Maestros]
GO
/****** Object: ForeignKey [FK_MateriasMaestros_Materias] Script Date: 12/19/2009
09:09:50 ******/
ALTER TABLE [dbo].[MateriasMaestros] WITH CHECK ADD CONSTRAINT
[FK_MateriasMaestros_Materias] FOREIGN KEY([IdMateria])
REFERENCES [dbo].[Materias] ([IdMateria])
GO
ALTER TABLE [dbo].[MateriasMaestros] CHECK CONSTRAINT
[FK_MateriasMaestros_Materias]
GO

Ahora necesitamos crear un proyecto nuevo, de tipo Windows Forms con C#,
aunque LINQ se puede usar en cualquier otro tipo de proyecto, aqu lo haremos de
este modo, debido a su rpida implementacin para el ejemplo. Necesitaremos 3
pantallas la cuales se ven aqu..
El siguiente paso es registrar nuestra base de datos en el explorador de servidores
del IDE, lo cual doy por sentado es sabido por todos como hacerlo. Apenas
terminamos eso debemos agregar al proyecto un elemento nuevo de Clases de LINQ
to SQL con este nombre: LinqUniversidad.dbml.

En el ltimo objeto creado arrastramos las 3 tablas desde el explorador de servidores y


Visual Studio se encargar de mapear en clases por nosotros. Es recomendado no hacer
cambios en stas clases a no ser que estemos totalmente seguros de lo que estamos
haciendo, si deseamos agregar funciones bien podemos hacerlo desde clases externas
(como lo haremos aqu)..

Debera quedar algo as nuestro mapeo grfico..

Ya es hora de agregar la clase LINQ, la cual llamaremos LinqMaestros.cs, su


contenido ser el siguiente y se encargar de tener los mtodos de creacin y
bsquedas de maestros..
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace SysUniversidad
{
class LinqMaestros
{

LinqUniversidadDataContext univ = new LinqUniversidadDataContext();

// metodo para crear un registro de maestro


internal int CrearMaestro(string nombres, string documento, DateTime
fechaNacimiento)
{
// instancia de maestro
Maestros maestro = new Maestros();

// asignacion de atributos
maestro.Nombres = nombres;
maestro.Documento = documento;
maestro.FechaNacimiento = fechaNacimiento;

// preparamos el objeto a insertar


univ.Maestros.InsertOnSubmit(maestro);

try
{
// confirmamos la creacion
univ.SubmitChanges();
// retornamos el valor del identity
return maestro.IdMaestro;
}
catch (Exception ex)
{ throw ex; }
} // end Crear Maestro

// metodo para buscar un maestro por su ID


internal Maestros BuscarMaestroById(int idMaestro)
{
try
{
// query linq para obtener un maestro
var maestro = from m in univ.Maestros
where m.IdMaestro == idMaestro
select m;

// verificar si existia lo buscado


if (maestro.Count() > 0)
return maestro.First();
else
return null;
} catch (Exception ex) {
throw ex;
} // end try
} // end BuscarMaestroById

// metodo para listar todos los maestros


internal IEnumerable BuscarMaestros()
{
try
{
// query linq para obtener la lista de maestros
return from m in univ.Maestros
select m;

} catch (Exception ex) {


throw ex;
} // end try
} // end BuscarMaestroById
} // end LinqDeploy
} // end SysUniversidad

La pantalla principal contendra este cdigo, vindose los mtodos de los botones..

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace SysUniversidad
{
public partial class frmMaestros : Form
{
public frmMaestros()
{
InitializeComponent();
}

private void btnGuardar_Click(object sender, EventArgs e)


{
// procedemos a guardar
LinqMaestros qMaestro = new LinqMaestros();
int identity;
try
{
identity = qMaestro.CrearMaestro(txtNombres.Text, txtDocumento.Text,
dtpFecha.Value);
MessageBox.Show("Se ha creado el Maestro: " + txtNombres.Text + " Con
Identificador: " + identity);
} catch (Exception ex) {
MessageBox.Show(ex.Message);
} // end try
} // end btnGuardar_Click

void CargarPantalla(Maestros maestro)


{
if (maestro == null)
{ // limpiamos pantalla
txtNombres.Text = String.Empty;
txtDocumento.Text = String.Empty;
dtpFecha.Value = DateTime.Now;
} else { // cargamos la pantalla
txtNombres.Text = maestro.Nombres;
txtDocumento.Text = maestro.Documento;
dtpFecha.Value = maestro.FechaNacimiento;
} // endif
} // end CargarPantalla

private void btnBuscar_Click(object sender, EventArgs e)


{
// instanciamos el linq y el form
LinqMaestros qMaestros = new LinqMaestros();
frmBuscarMaestro buscar = new frmBuscarMaestro();
buscar.ShowDialog();
try {
// hacemos peticion del retorno de lo ingresado en la pantalla de buscar
Maestros maestro = qMaestros.BuscarMaestroById(buscar.DevolverId);
CargarPantalla(maestro);
} catch (Exception ex) {
MessageBox.Show(ex.Message);
} // end try
} // end btnBuscar_Click

private void btnListarMaestros_Click(object sender, EventArgs e)


{
frmListaMaestros Lista = new frmListaMaestros();
LinqMaestros qMaestros = new LinqMaestros();
try {
// asignamos al datasource de la grilla la lista de maestros recuperada
Lista.dtpListaMaestros.DataSource = qMaestros.BuscarMaestros();
Lista.ShowDialog();
} catch (Exception ex) {
MessageBox.Show(ex.Message);
} // end try
} // end btnListarMaestros_Click
} // end class
} // end namespace

Y por ltimo tan solo quedara el cdigo de la pantalla de bsqueda, el formulario


para listar no contendr cdigo alguno..

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace SysUniversidad
{
public partial class frmBuscarMaestro : Form
{
public frmBuscarMaestro()
{
InitializeComponent();
}

private void cmdBuscar_Click(object sender, EventArgs e)


{
this.Close();
}

public int DevolverId


{
get
{
int i = 0;
int.TryParse(txtId.Text, out i);
return i;
} // end get
} // end DevolverId
}
}

Nota: Debemos recordar modificar el modificador de la grilla en el formulario


frmListarMaestros a public
LINQ to XML, Leer Archivo XML C#

Veamos mediante un ejemplo prctico y sencillo como leer desde el disco un archivo XML
con .NET (C#).

En el .NET 3.5 se han agregado 3 nuevas clases (XDocument, XElement, XAttribute)


relacionadas al espacio de nombre (namespace) System.Xml.Linq; con estas clases de
.NET es muy simple leer un fichero XML, veamos un ejemplo de como hacerlo, para ello
usaremos C#.

Pero antes veamos el fichero XML que pretendemos leer.

Archivo XML a Leer

<?xml version="1.0" encoding="utf-8"?>


<Contactos>
<Contacto>
<Nombre>Juan</Nombre>
<EMail>juan@gmail.com</EMail>
<Telefono Tipo="Mvil">666666666</Telefono>
<Telefono Tipo="Trabajo">911111111</Telefono>
</Contacto>
<Contacto>
<Nombre>Luis</Nombre>
<EMail>luis@gmail.com</EMail>
<Telefono Tipo="Mvil">666777777</Telefono>
</Contacto>
<Contacto>
<Nombre>Mara</Nombre>
<EMail>maria@gmail.com</EMail>
<Telefono Tipo="Mvil">666888888</Telefono>
<Telefono Tipo="Personal">91222222</Telefono>
</Contacto>
</Contactos>

Cdigo LINQ XML para leer Archivo

Existen varias formas en .NET C# para leer un fichero XML, ac expondremos 2 formas
distintas aunque si fuera yo quien tuviese que elegir me quedara con esta primera variante
de cdigo para leer un archivo XML. Esta primera variante usa el mtodo Descendants que
existe en ambas clases (XElement y XDocument):

// Cdigo para leer un fichero XML usando LINQ 2 XML


private static void Linq2XmlLeerFicheroXmlConXElement()
{
XElement xmlContactos = XElement.Load("Contactos.xml");

//Obtener el Nombre de todos los contactos


var contactosAll =
from c in xmlContactos.Descendants("Contacto")
select c.Element("Nombre").Value;

//Obtener todos los contactos cuyo nombre comiencen con L


var contactosL =
from c in xmlContactos.Descendants("Contacto")
where c.Element("Nombre").Value.StartsWith("L")
select c;

//Obtener todos los contactos que al menos uno de los Telefonos sea de Tipo Personal
var contactosTelPers =
from c in xmlContactos.Descendants("Contacto")
where null != c.Elements("Telefono").Attributes("Tipo").
FirstOrDefault(t => t.Value == "Personal")
select c;
}

Otra variante de cdigo para obtener el mismo resultado:

// Cdigo para leer un fichero XML usando LINQ 2 XML


private static void Linq2XmlLeerFicheroXml()
{
XDocument docContactos = XDocument.Load("Contactos.xml");

//Obtener el Nombre de todos los contactos


var contactosAll =
from c in docContactos.Elements("Contactos").Elements("Contacto")
select c.Element("Nombre").Value;

//Obtener todos los contactos cuyo nombre comiencen con L


var contactosL =
from c in docContactos.Elements("Contactos").Elements("Contacto")
where c.Element("Nombre").Value.StartsWith("L")
select c;

//Obtener todos los contactos que al menos uno de los Telefonos sea de Tipo Personal
var contactosTelPers =
from c in docContactos.Elements("Contactos").Elements("Contacto")
where null != c.Elements("Telefono").Attributes("Tipo").
FirstOrDefault(t => t.Value == "Personal")
select c;
}

Con este ejemplo lo que logramos es leer el fichero XML Contactos.xml y realizar
diferentes consultas LINQ filtrando por determinados criterios.