Ya en la versión 2, los controles enlazados, como son el gridView, podían paginarse, para eso simplemente accedíamos al Smart Tag del control, y seguíamos el asistente, hasta que le asociábamos un datasource.

Este método, aunque fácil de realizar, y eficiente, era poco recomendable, porque llevaba al archivo aspx, la consulta que debía ejecutar de forma paginada, lo que era un problema de seguridad, y lo que conllevaba dar pistas sobre el esquema de la base de datos, además de dotar de información sobre vistas o tablas sobre las que se realizaba la consulta.
Estos problemas de seguridad, se solucionaban paginando a mano, generando uno botones de paginación y asociando las consultas conforme al número de página y el tamaño de página el cual, era deseable que fuese configurable a través del web.config.
<appSettings>
<add key="TamanoPagina" value="30"/>
</appSettings>
Con la llegada del asp.net 4.5, surge una nueva opción, y es que aprovechando otra de las nuevas cualidades, nos permitirá asociar al datasource una consulta de linQ, es decir un objeto Queryable. Si además tipamos el control, este estará capacitado para mostrar el número de páginas y paginar los datos mostrados, ejecutando una consulta cada vez que tiene que recargar los datos mostrados en este control.
<asp:GridView ID="grvUsuarios" runat="server"
ModelType="WebApplication1.Model.Usuarios"
SelectMethod="GetUsuarios" AutoGenerateColumns="false">
<Columns>
<asp:BoundField DataField="DNI" HeaderText="DNI" />
<asp:BoundField DataField="Nombre" HeaderText="NOMBRE" />
<asp:BoundField DataField="Descripcion" HeaderText="Descripción" />
<asp:TemplateField HeaderText="# de Usuarios">
<ItemTemplate><%#Item.Usuarios.Count %></ItemTemplate>
</asp:TemplateField>
</Columns>
</ asp:GridView >
Como vemos al utilizar el ModelType, estamos tipando el control, con lo que ya no será necesario utilizar etiquetas del servidor o el evento RowDataBound, para mostrar los datos en las columnas, y estas reciben los valores del objeto Model.Usuarios.
Además vemos que se utiliza el elemento SelectMethod, donde especificaremos el método, dentro del codebehind, que utilizaremos para pasarle el objeto Queryable.
public IQueryable<Category> GetUsuarios ()
{
var db = new MinegocioDB();
return db.Usuarios.Include(c => c.Usuarios);
}