Linq support server-side data paging : Javier Luna blog

Thursday, October 09, 2008

Linq support server-side data paging

Cuando estas desarrolando software con Visual Studio 2008 para utilizar todos los beneficios de usar Linq, te encontraras con este mensaje de error, al intentar enlazar un origen de datos Enumerable.SelectIterator sobre un GridView:

The data source does not support server-side data paging.

Apesar de haber configurado las propiedades AllowPaging="true" del GridView, este mensaje te saca de las casillas y puedes equivocadamente sospechar que las expresiones Linq NO pueden enlazarse a un simple GridView.

var q = from item in Clients select item;
this._grid.DataSource = q;

Donde la variable Clients es una coleccion de datos, cualesquiera.

Sin embargo, al enlazar el objeto de estructura de datos inferida, es decir: q, sobre el DataSource del GridView, debe utlizar el metodo ToList()

this._grid.DataSource = q.ToList();

De esta manera superaras un inconveniente tecnico, que antes NO se habia experimentado, es decir en las versiones anteriores.

Linq brinda una serie de beneficios para poder trabajar con colecciones de objetos en el mundo .NET de una manera similar a SQL, sin que esto implique necesariamente una operacion hacia la Base de Datos.

Naturalmente, entre los pro y contra encontra algunas dificultades tecnicas que se deben superar.

4 comments:

Enzo said...

Javier, hice lo q dices en tu Blog, pero no me funciona, ojala y puedas ayudarme te dejo los codigos haber en q me estoy equivocando, llegue a tu blog buscando una respuesta al error "El origen de datos no admite la paginación de datos del servidor", el cual solucione con tu solucion, pero el problema ahora es q no me llena la Grid.

ASPX.
HeaderText="Numero" DataField="Numero" SortExpression="Numero"
HeaderText="Item" DataField="NumeroItem" SortExpression="Nro_Item"
HeaderText="Fecha Guia" DataField="Fecha" SortExpression="FechaGuia" DataFormatString="{0:dd/MM/yyyy}"
HeaderText="Fecha Informe" DataField="Fecha_Informe" SortExpression="FechaInforme"
HeaderText="Rut" DataField="Rut" SortExpression="Rut"
HeaderText="Cliente" DataField="Cliente" SortExpression="Cliente"
HeaderText="Nombre Tecnico" DataField="NombreTecnico" SortExpression="Nombre_Tecnico"
HeaderText="Revisada" DataField="Revisada" SortExpression="Revisada"


ASPX.CS

private void gvDataBind()
{
var _objInformesTecnico = new List EnInformeTecnico();
var _objGuiaLaboratorio = new List EnGuiaLaboratorio();
_objInformesTecnico = NgInformeTecnico.Buscar(filtroWhere);
_objGuiaLaboratorio = NgGuiaLaboratorio.BuscarDatosInfTec(filtroWhere1);
var _objInformeTecnico = from Informe_Tecnico in _objInformesTecnico
join Guia_Laboratorio in _objGuiaLaboratorio on
Informe_Tecnico.Numero equals Guia_Laboratorio.Numero
select new
{ Informe_Tecnico.Numero, Informe_Tecnico.NumeroItem, Guia_Laboratorio.Fecha, Informe_Tecnico.FechaInforme, Guia_Laboratorio.Rut, Guia_Laboratorio.Cliente, Informe_Tecnico.NombreTecnico, Informe_Tecnico.Revisada };
gvBusInformeTecnico.DataSource = _objInformeTecnico.ToList(); gvBusInformeTecnico.DataBind();
}

al Codigo le tuve q hacer una serie de cambios, al codigo q te estoy mostrando aka, por q no me dejo publicar los Tags<>, ok. por si lo ves medio raro...

...muchas gracias de antemano.

kevin bosch said...

Que curioso!

Lo primero que tendrias que validar es si la variable _objInformeTecnico que se enlaza al GridView tiene elementos o NO.

Yo haria un:

Response.Write( _objInformeTecnico.ToCount() );

Para descartar eso.

Luego serian ya propiedades del GridView o verificar que el metodo gvDataBind NO se esta ejecutando.

Diego said...

Excelente aporte Javier, funcionó perfectamente, ...
Gracias

kevin bosch said...

Buena noticia que te haya funcionado :)