Está en la página 1de 11

Tecnologías Microsoft http://mredison.wordpress.

com

Utilizando LINQ Mapping con WCF en Visual Studio 2010


(ASP.NET C#) Parte 2
Requerimientos:

 Visual Studio 2010


 SQL Server 2008 o SQL Server 2008 R2

Continuando con el artículo técnico anterior


http://mredison.files.wordpress.com/2010/08/utilizando-linq-con-wcf.pdf

Paso 1:

Dentro del proyecto de tipo WCF, agregue los siguientes métodos a la interfaz.

using System;
using System.Collections.Generic;
using System.Linq;
using System.ServiceModel;

namespace WCFLinq
{
[ServiceContract]
public interface IMetodos
{
[OperationContract]
List<Cliente> ObtenerClientes();

[OperationContract]
List<Cliente> ObtenerClientesPorLocalizacion(string localizacion);

[OperationContract]
void AgregarCliente(string nombre, string localizacion);

[OperationContract]
void ActualizarCliente(int id, string nombre, string localizacion);

[OperationContract]
void EliminarCliente(int id);

}
}

Paso 2:

Implemente los métodos agregados dentro de la clase:


Tecnologías Microsoft http://mredison.wordpress.com

Primer método AgregarCliente(string nombre, string localizacion)

public void AgregarCliente(string nombre, string localizacion)


{
Cliente nuevoCliente
= new Cliente { Nombre = nombre, Localizacion = localizacion };
bd.Clientes.InsertOnSubmit(nuevoCliente);
bd.SubmitChanges();
}

Debe crear una nueva instancia de la clase Cliente, agregando los valores. Después llamar al
método InsertOnSubmit(entity class) para agregar el registro al contexto de datos
(DataContext) y por último al método SubmitChanges() para actualizarlo sobre la base de
datos.

Segundo método ActualizarCliente(int id, string nombre, string localizacion)

public void ActualizarCliente(int id, string nombre, string localizacion)


{
Cliente cliente = bd.Clientes.Single(c => c.ID == id);
cliente.Nombre = nombre;
cliente.Localizacion = localizacion;
bd.SubmitChanges();
}

Debe crear una condición de LINQ consultando al contexto de datos y con el método Single
(expresión) en el cual solo retornará de la colección de datos el elemento que cumpla con la
condición asignada anteriormente, en este caso se utiliza una expresión lambda.

Si desea profundizar en el tema de las expresiones lambda puede ver la referencia siguiente:

http://msdn.microsoft.com/es-es/library/bb397687.aspx

Una vez teniendo el elemento que cumple con la condición puede asignarlo a un objeto de
tipo Cliente, y actualizar sus propiedades. Por último se realizará una actualización en la base
de datos.

Tercer método EliminarCliente( int id)

public void EliminarCliente(int id)


{
Cliente cliente = bd.Clientes.Single(c => c.ID == id);
bd.Clientes.DeleteOnSubmit(cliente);
bd.SubmitChanges();
}

De la misma forma que el método anterior se buscará un elemento que cumpla con la
condición, se realizará la eliminación por medio del método DeleteOnSubmit(entity class) y
se actualizará sobre la base de datos con el método SubmitChanges().
Tecnologías Microsoft http://mredison.wordpress.com

El código completo de la clase que implementa la interfaz es el siguiente:


using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.ServiceModel.Web;

namespace WCFLinq
{
public class Servicio : IMetodos
{
Empresa bd = new Empresa();

public List<Cliente> ObtenerClientes()


{
var consulta = from cl in bd.Clientes
select cl;
return consulta.ToList();
}

public List<Cliente> ObtenerClientesPorLocalizacion(string localizacion)


{
var consulta = from cl in bd.Clientes
where cl.Localizacion.Contains(localizacion)
select cl;
return consulta.ToList();
}

public void AgregarCliente(string nombre, string localizacion)


{
Cliente nuevoCliente
= new Cliente { Nombre = nombre, Localizacion = localizacion };
bd.Clientes.InsertOnSubmit(nuevoCliente);
bd.SubmitChanges();
}

public void ActualizarCliente(int id, string nombre, string localizacion)


{
Cliente cliente = bd.Clientes.Single(c => c.ID == id);
cliente.Nombre = nombre;
cliente.Localizacion = localizacion;
bd.SubmitChanges();
}

public void EliminarCliente(int id)


{
Cliente cliente = bd.Clientes.Single(c => c.ID == id);
bd.Clientes.DeleteOnSubmit(cliente);
bd.SubmitChanges();
}
}
}
Tecnologías Microsoft http://mredison.wordpress.com

Paso 3:

Compile y vaya al proyecto Web, de clic derecho a la referencia del servicio web y después en
Actualizar Referencia de Servicio (Update Service Reference).

Paso 4:

Agregue controles web, textbox y botón para proceder a agregar un cliente.


Tecnologías Microsoft http://mredison.wordpress.com

Paso 5:

De doble clic al botón btnAgregar.


protected void btnAgregar_Click(object sender, EventArgs e)
{
try
{
if (txtNombre.Text != String.Empty
&& txtLocalizacion.Text != String.Empty)
proxy.AgregarCliente(txtNombre.Text, txtLocalizacion.Text);
}
catch (LinqDataSourceValidationException ex)
{
Response.Write(ex.Message.ToString());
}
catch (Exception ex)
{
Response.Write(ex.Message.ToString());
}
finally
{
txtNombre.Text = "";
txtLocalizacion.Text = "";
gvClientes.DataSource = proxy.ObtenerClientes();
gvClientes.DataBind();
}
}

Paso 6:

Compile y ejecute la aplicación realice una prueba.


Tecnologías Microsoft http://mredison.wordpress.com

Prueba exitosa.

Paso 7:

Coloque la opción de eliminar al GridView, desde el código de ASP.NET usted puede


personalizar la información que se mostrará en el control de datos, agregando columnas de
tipo BoundField indicando el campo de la tabla dentro de la propiedad DataField.

<asp:GridView ID="gvClientes" AutoGenerateColumns="false" runat="server">


<Columns>
<asp:BoundField HeaderText="ID" DataField="ID" />
<asp:BoundField HeaderText="Nombre" DataField="Nombre" />
<asp:BoundField HeaderText="Localización" DataField="Localizacion" />
<asp:CommandField DeleteText="Eliminar" ShowDeleteButton="true"
ButtonType="Link" />
</Columns>
</asp:GridView>

Paso 8:

Seleccione el control GridView y vaya a sus propiedades, después a los eventos y de doble clic
al evento RowDeleting.
Tecnologías Microsoft http://mredison.wordpress.com

Paso 9:

Dentro del método RowDeleting, se necesita buscar el valor del cliente ID, y saber que índice
de fila se requiere eliminar, para obtener ese valor y eliminarlo se agrega el siguiente código:

protected void gvClientes_RowDeleting(object sender, GridViewDeleteEventArgs e)


{
try
{
int id = Convert.ToInt32(gvClientes.Rows[e.RowIndex].Cells[0].Text);
proxy.EliminarCliente(id);

}
catch (Exception ex)
{
Response.Write(ex.Message.ToString());
}
finally
{
gvClientes.DataSource = proxy.ObtenerClientes();
gvClientes.DataBind();
}
}

Paso 10:

Compilar y ejecutar una prueba, eliminando del GridView un elemento.


Tecnologías Microsoft http://mredison.wordpress.com

Paso 11:

Ahora agregará la opción de Editar dentro del GridView, para esto se debe utilizar columnas
de tipo TemplateField, el cual le da la opción de tener plantillas de visualización y edición de
datos, además de utilizar la función Bind() que le brinda la posibilidad de escritura sobre los
datos.

Si desea profundizar en el tema de las Expresiones de Datos Bind() y Eval() puede consultar la
referencia siguiente:

http://msdn.microsoft.com/en-us/library/ms178366.aspx

Debe actualizar el código ASP.NET de su GridView de la siguiente manera:

<asp:GridView ID="gvClientes" AutoGenerateColumns="false" runat="server"


onrowdeleting="gvClientes_RowDeleting">
<Columns>
<asp:BoundField HeaderText="ID" DataField="ID" />
<asp:TemplateField HeaderText="Nombre">
<ItemTemplate>
<asp:Label ID="lblVerNombre" Text='<%# Bind("Nombre") %>' runat="server"></asp:Label>
</ItemTemplate>
<EditItemTemplate>
<asp:Textbox ID="txtEditarNombre" Text='<%# Bind("Nombre") %>' runat="server"></asp:Textbox>
</EditItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Localización">
<ItemTemplate>
<asp:Label ID="lblVerLoc" Text='<%# Bind("Localizacion") %>' runat="server"></asp:Label>
</ItemTemplate>
<EditItemTemplate>
<asp:Textbox ID="txtEditarLoc" Text='<%# Bind("Localizacion") %>' runat="server"></asp:Textbox>
</EditItemTemplate>
</asp:TemplateField>
<asp:CommandField DeleteText="Eliminar" ShowDeleteButton="true" ButtonType="Link" />
<asp:CommandField EditText="Editar" UpdateText="Actualizar"
CancelText="Cancelar" ShowEditButton="true" ButtonType="Link" />
</Columns>
</asp:GridView>

Paso 12:

Dentro del método RowEditing(), colocará el siguiente código:

protected void gvClientes_RowEditing(object sender, GridViewEditEventArgs e)


{
gvClientes.EditIndex = e.NewEditIndex;
gvClientes.DataSource = proxy.ObtenerClientes();
gvClientes.DataBind();

Esto le dará la opción de edición dentro de la fila seleccionada y acceder al


EditItemTemplate.
Tecnologías Microsoft http://mredison.wordpress.com

Paso 13:

Repita el mismo proceso ahora con el método RowCancelingEdit()

protected void gvClientes_RowCancelingEdit(object sender,


GridViewCancelEditEventArgs e)
{
gvClientes.EditIndex = -1;
gvClientes.DataSource = proxy.ObtenerClientes();
gvClientes.DataBind();
}

Si usted coloca el índice -1 volverá al GridView en su modo normal.

Paso 14:

Método RowUpdating()

protected void gvClientes_RowUpdating(object sender, GridViewUpdateEventArgs e)


{
int id = Convert.ToInt32(gvClientes.Rows[e.RowIndex].Cells[0].Text);
TextBox nombre =
(TextBox)(gvClientes.Rows[e.RowIndex].FindControl("txtEditarNombre") as TextBox);
TextBox localizacion =
(TextBox)(gvClientes.Rows[e.RowIndex].FindControl("txtEditarLoc") as TextBox);

try
{
if(nombre.Text!=String.Empty && localizacion.Text!=String.Empty)
proxy.ActualizarCliente(id, nombre.Text, localizacion.Text);
}
catch (Exception ex)
{
Response.Write(ex.Message.ToString());
}
finally
{
gvClientes.EditIndex = -1;
gvClientes.DataSource = proxy.ObtenerClientes();
gvClientes.DataBind();
}

Dentro de este método identificará los valores de los controles por medio del método
FindControl(ControlID) de acuerdo a la fila seleccionada e.RowIndex.

Paso 15:

Compile y ejecute la aplicación, realice pruebas de edición, actualización, cancelación y


eliminación.
Tecnologías Microsoft http://mredison.wordpress.com

Paso 16:

Optimización de código. Agregando el método Actualizar()

Código Completo:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class _Default : System.Web.UI.Page


{
ServicioWCF.MetodosClient proxy = new ServicioWCF.MetodosClient();

protected void Page_Load(object sender, EventArgs e)


{
if (!IsPostBack)
{
Actualizar();
}

protected void Actualizar()


{
gvClientes.DataSource = proxy.ObtenerClientes();
gvClientes.DataBind();

var consulta = (from cl in proxy.ObtenerClientes()


select cl.Localizacion).Distinct();

ddLocalizacion.DataSource = consulta.ToList();
ddLocalizacion.DataBind();
}

protected void ddLocalizacion_SelectedIndexChanged(object sender, EventArgs e)


{
gvClientes.DataSource =
proxy.ObtenerClientesPorLocalizacion(ddLocalizacion.SelectedItem.Text);
gvClientes.DataBind();
}

protected void btnAgregar_Click(object sender, EventArgs e)


{
try
{
if (txtNombre.Text != String.Empty && txtLocalizacion.Text != String.Empty)
proxy.AgregarCliente(txtNombre.Text, txtLocalizacion.Text);
}
catch (LinqDataSourceValidationException ex)
{
Response.Write(ex.Message.ToString());
}
catch (Exception ex)
{
Response.Write(ex.Message.ToString());
}
finally
{
txtNombre.Text = "";
txtLocalizacion.Text = "";
Actualizar();
}
}
Tecnologías Microsoft http://mredison.wordpress.com

protected void gvClientes_RowDeleting(object sender, GridViewDeleteEventArgs e)


{
try
{
int id = Convert.ToInt32(gvClientes.Rows[e.RowIndex].Cells[0].Text);
proxy.EliminarCliente(id);

}
catch (Exception ex)
{
Response.Write(ex.Message.ToString());
}
finally
{
Actualizar();
}
}
protected void gvClientes_RowEditing(object sender, GridViewEditEventArgs e)
{
gvClientes.EditIndex = e.NewEditIndex;
Actualizar();

}
protected void gvClientes_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e)
{
gvClientes.EditIndex = -1;
Actualizar();
}
protected void gvClientes_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
int id = Convert.ToInt32(gvClientes.Rows[e.RowIndex].Cells[0].Text);
TextBox nombre = (TextBox)(gvClientes.Rows[e.RowIndex].FindControl("txtEditarNombre") as
TextBox);
TextBox localizacion = (TextBox)(gvClientes.Rows[e.RowIndex].FindControl("txtEditarLoc") as
TextBox);

try
{
if(nombre.Text!=String.Empty && localizacion.Text!=String.Empty)
proxy.ActualizarCliente(id, nombre.Text, localizacion.Text);
}
catch (Exception ex)
{
Response.Write(ex.Message.ToString());
}
finally
{
gvClientes.EditIndex = -1;
Actualizar();
}

}
}

Este documento ha sido elaborado por Edison Daniel García Chiñas para el blog de
Tecnologías Microsoft para distribución gratuita. http://mredison.wordpress.com

Comentarios, sugerencias y mejoras a edison@iedusoft.com

Comparte este documento con un amigo