Ramon Torras

TECHNOLOGY ENTHUSIAST

Cómo pasar los datos LINQ a un Control DataSource

Hay muchas formas de llegar al destino: Hacer un binding de la variable resultante de la expresión LINQ a un control.

Yo expongo en este post la más cómoda para mí. Si sabéis de otros métodos, por favor, no dudéis en comentarlos en el post y los incluiré J

Primero veamos el caso más sencillo, tengo un objeto enumerable y quiero hacer directamente un binding:

Mediante el método: toList<Type>()


var query1 = (from n in excol


where n.PorMaternidad == GetValue()


select n);

 


List<Excedencia> list = new
List<Excedencia>();

 

list = query1.ToList<Excedencia>();

 

gridDevoluciones.DataSource = list;

gridDevoluciones.DataBind();

 

Vamos al el caso mas complejo, una JOIN entre tres objetos enumerables. En este caso, 3 Collections enumerables (En este post podemos ver como una collection herede de ienumerable).

En estas 3 collections queremos hacer una join a la collection principal (que solo tiene los valores ID).

  • Con la Join quiero mostrar las descripciones de los valores en una nueva vista.

ClaseIncidenciaList claselist = new
ClaseIncidenciaList();

ClaseIncidenciaCollection clasecol = claselist.GetItems();

 

TipoIncidenciaList tipolist = new
TipoIncidenciaList();

TipoIncidenciaCollection tipocol = tipolist.GetItems();

 

EstadoIncidenciaList estadolist = new
EstadoIncidenciaList();

EstadoIncidenciaCollection estadcol = estadolist.GetItems();

 

Tenemos, por ejemplo una expresión LINQ como esta:

var query2 = (from n in incidcol


join np in clasecol on n.ClasseIncidencia equals np.ID


join nc in tipocol on n.Tipo equals nc.ID


join ne in estadcol on n.Estado equals ne.ID


select
new { id = n.ID, cliente = n.ContactId, claseincidencia = np.Titulo, estado = ne.Titulo, tipo = nc.Titulo }

);

 

El problema es que no podemos hacer un toList<Type> pq el tipo resultante es anónimo. La solución pasa por generar una Dataview

DataTable view = new
DataTable();

view.Columns.Add( id );

view.Columns.Add( cliente );

view.Columns.Add( claseincidencia );

view.Columns.Add( tipo );

view.Columns.Add( estado );


foreach (var t in query2)

{

view.Rows.Add(t.id, t.cliente, t.claseincidencia, t.tipo, t.estado);

}


DataView dv = view.DefaultView;

 

Ahora que ya tenemos el objeto DataView ya lo podemos asignar a un DataSource o lo podemos filtrar por cada una de sus columnas mediante el método RowFilter.

Si queréis saber mas del método RowFilter en este link hay algunos ejemplos:

http://msdn.microsoft.com/en-us/library/bb669073(v=vs.90).aspx

Saludos

Comments are currently closed.