82603731 introduccion a linq

Upload: erosales

Post on 17-Jul-2015

76 views

Category:

Documents


0 download

TRANSCRIPT

Usando LINQ to SQL (1 Parte)LINQ, LINQ to SQL, Scott Guthri Add commentsmay

202007

En los ltimos meses he escrito una serie de post que cubran algunas de las caractersticas que van a venir con Visual Studio y .NET Framework Orcas. Aqu tenis los enlaces:

Propiedades automticas, inicializadores de objetos e inicializadores de

colecciones.

Mtodos de extensin. Expresiones Lambda. Sintaxis de consultas. Tipos Annimos

Las caractersticas anteriores hacen que la consulta de datos sea un concepto de primera clase. Conocemos a este modelo de programacin como LINQ que viene de .NET Language Integrated Query. Los desarrolladores pueden usar LINQ con cualquier fuente de datos. Pueden expresar consultas eficientemente en los lenguajes de programacin que eligan, opcionalmente transformar/incrustar los resultados de las consultas en el formato que quieran, y entonces manipular fcilmente los resultados. Los lenguajes habilitados para LINQ pueden aportar seguridad de tipos y chequeo en tiempo de compilacin en las expresiones de consulta, y desarrollar herramientas que aporten intelisense, debugging, y un gran soporte para refactoring cuando escriban cdigo de LINQ. LINQ soporta un modelo de extensibilidad muy rico que facilita la creacin de operadores eficientes para fuentes de datos. La versin Orcas del .NET Framework viene con libreras que habilitan LINQ sobre objetos, XML y bases de datos. Qu es LINQ to SQL? LINQ to SQL es una implementacin de O/RM(object relational mapping, mapeador de objetos relacionales) que viene con la versin Orcas del .NET Framework, y nos permite modelar bases de datos relacionales con clases de .NET. Podemos consultar bases de datos con LINQ, as como actualizar/aadir/borrar datos de ellas. Modelando bases de datos con LINQ to SQL:

Visual Studio Orcas viene con un diseador de LINQ to SQL que nos aporta una forma fcil de modelar y visualizar una base de datos como un modelo de objeto de LINQ to SQL. El prximo post cubrir en ms profundidad cmo usar este diseador (podis ver ste video que hice en Enero para verme construir un modelo LINQ to SQL). Usando ese diseador LINQ to SQL puedo crear fcilmente una representacin de la base de datos Northwind:

El diseo de arriba define cuatro clases: Product, Category, Order y OrderDetail. Las propiedades de cada clase mapean las columnas de cada table en la base de datos. Cada instancia de esa clase representa una fila en las tablas.

Las flechas entre las cuatro clases de arriba representan las asociaciones/relaciones entre las diferentes entidades. Son tpicamente modeladas como relaciones primary-key/foreignkey en la base de datos. La direccin de las flechas en el diseador indican si la relacin es uno-a-uno o uno-a-varios. Se aadiran propiedades fuertemente tipadas a las entidades basndose en esto. Por ejemplo, la clase Category de arriba tiene una relacin de uno-avarios con la clase Product. Esto implica que tendr una propiedad Categories que es una coleccin de objetos Product con esa categora. La clase Product entonces tiene una propiedad Category que apunta a una instancia de la clase Category representando la categora a la que pertenece el producto. El panel de la derecha del diseador LINQ to SQL contiene una lista de procedimientos almacenados que interactan con nuestro modelo de base de datos. En el ejemplo de arriba hemos aadido un SPROC (Procedimiento almacenado) GetProductsByCategory. Como entrada recibe un categoryID, y devuelve una secuencia de Product como resultado. Veremos cmo llamar a este procedimiento almacenado en un ejemplo. Entendiendo la clase DataContext Cuando pulsis el boton save del diseador de LINQ to SQL, Visual Studio generar clases .NET para representar las entidades y las relaciones de la base de datos que hemos modelado. Por cada archivo aadido a nuestra solucin por el diseador LINQ to SQL tambin se generar una clase DataContext. Esta clase es a traves de la cual realizaremos las consultas a las entidades de nuestra base de datos. Esta clase tendr propiedades que representarn a cada tabla que hemos modelado, as como mtodos para cada procedimiento almacenado que aadamos. Por ejemplo, aqu tenis la clase NorthwindDataContext:

Ejemplos de LINQ to SQL Una vez que hemos modelado nuestra base de datos con el diseador de LINQ to SQL, podemos escribir cdigo fcilmente para trabajar con l. Aqu tenis unos cuantos ejemplos que muestran tareas comunes con datos: 1) Consultando Products de la base de datos El siguiente cdigo usa una consulta LINQ para obtener una secuencia IEnumerable de objetos Product. Fijos que este cdigo est consultando a traves de la relacin Product/Category para obtener aquellos productos de la categora Beverages. C#:

VB:

2) Actualizando un producto en la base de datos. El cdigo siguiente muestra cmo obtener un producto de la base de datos, actualizar su precio, y guardar los cambios en la base de datos: C#:

VB:

Nota: VB en Orcas Beta1 no soporta Lambdas an. Pero en la Beta2 s -de forma que el cdigo anterior se podr escribir de una forma ms concisa. 3) Aadir una nueva categora y dos nuevos productos en la base de datos. El siguiente cdigo muestra cmo crear una nueva categora, y entonces crear dos nuevos productos y asociarlos a la nueva categora. Los tres son despus guardados en la base de datos.

Fijaos como no necesitamos administrar manualmente las relaciones primarykey/foreignkey. Slo tenemos que aadir los objetos Product en la coleccin Products de la categora, y luego aadir el nuevo objeto Category en la coleccin de Categories del DataContext, LINQ to SQL sabr automticamente crear las PF/FK necesarias: C#:

4)Borar productos de la base de datos. El cdigo siguiente muestra cmo borrar todos los productos Toy de la base de datos: C#:

VB:

5) Llamar a un procedimiento almacenado. El cdigo siguiente muestra cmo obtener entidades de la tabla Product sin usar una consulta LINQ, sino llamando al procedimiento almacenado GetProductsByCategory que aadimos a nuestro modelo de datos. Fijos que cuando obtenemos los resultados de la tabla Product, podemos actualizar/borrarlos y llamar a db.SubmitChanges() para hacer las modificaciones en la base de datos. C#:

VB:

6) Obtener productos con paginado del lado del servidor El cdigo siguiente muestra cmo implementar un paginado eficiente en el lado servidor como parte de una consulta LINQ. Usando los operadores Skip() y Take(), slo devoleremos 10 filas de la base de datos a partir de la fila 200. C#:

VB:

Resmen:

LINQ to SQL nos permite modelar la capa de datos de nuestras aplicaciones de una forma simple y limpia. Una vez que hayamos definido nuestro modelo de datos, podemos realizar consultas, inserciones, actualizaciones y borrados sobre ella de forma fcil y eficiente. Espero que esta introduccin os haya abierto el apetito de aprender ms. En las prximas semanas continuar esta serie de post explorando el LINQ to SQL en ms detalle. Espero que sirva.

LINQ to SQL (2 Parte Definiendo nuestras clases del modelo de datos).NET, ASP .NET, LINQ, LINQ to SQL, Visual Studio Add commentsmay

302007

En la primera parte de la serie de post sobre LINQ to SQL habl sobre qu es LINQ to SQL? y vimos por encima algunos escenarios que permite. En aqul post pusimos unos cuantos ejemplos de cdigo donde demostrbamos cmo mejorar la parte de datos usando LINQ to SQL:

Cmo consultar una base de datos. Cmo actualizar filas en una base de datos Cmo aadir y relacionar varias filas en una base de datos. Cmo eliminar filas de la base de datos. Cmo llamar a procedimientos almacenados. Cmo obtener datos con paginacin en el servidor.

Mejoramos todos estos escenarios usando un modelo de clases de LINQ to SQL como ste:

En este segundo post de la serie vamos a ver en ms detalle cmo crear el modelo anterior con LINQ to SQL. LINQ to SQL, el diseador de LINQ to SQL, y todas las caractersticas que estamos viendo saldrn con la versin de .NET 3.5 y en la release de Visual Studio Orcas. Podis seguir todos los pasos siguientes descargndo tanto Visual Studio Orcas Beta 1 o Visual Web Developer Express Orcas Beta 1. Podis instalar las dos y usarlas sin ningn problema con Visual Studio 2005. Crear un nuevo modelo de datos LINQ to SQL Podemos aadir un modelo de datos de LINQ to SQL a un projecto ASP.NET, Class Library o Windows, con la nueva opcin Add New Item seleccionando LINQ to SQL:

Seleccionando LINQ to SQL lanzar el diseador de LINQ to SQL, y nos permitir modelar las clases que representen una base de datos relacional. Tambin crear una clas fuertemente tipada DataContext que tendr las propiedades que representarn cualquier tabla que modelemos de la base de datos, as como mtodos para cada procedimiento almacenado que modelemos. Como describimos en la primera parte de esta serie de post, la clase DataContext es el conducto principal que usaremos tanto para consultar la base de datos como para guardar los cambios que hagamos. Aqu tenis una captura de pantalla de un diseo LINQ to SQL ORM vaco, es lo que veris despues de crear un nuevo modelo de datos LINQ to SQL:

Clases Entidad (Entity) LINQ to SQL nos permite modelar clases que mapeen una base de datos. Estas clases son tpicamente conocidas como Clases Entidad (en ingles Entity Classes) y a las instancias se las conoce como Entidades (en ingles Entities). Las clases entidad mapean a tablas de una base de datos. Las propiedades de una clase entidad normalmente mapean las columnas de la tabla. Cada instancia de una clase entidad representa a una fila de una tabla de la base de datos. Las clases entidad definidas por LINQ to SQL no tienen que derivar de una clase base especfica, lo que significa que pueden heredar de cualquier objeto que queramos. Todas las clases creadas por el diseador de LINQ to SQL se definen como clases parciales con lo que podemos, opcionalmente, aadir propiedades adicionales, mtodos y eventos. A diferencia de la caracterstica de DataSet/TableAdapter que aporta VS 2005, cuando usamos el diseador de LINQ to SQL no tenemos que especificar qu consultas SQL se tiene que usar cuando creamos el modelo de datos y la capa de acceso. En lugar de eso, nos centramos en definir las clases entidad, cmo se mapean con la base de datos, y las relaciones entre ellas. La implementacin del ORM de LINQ to SQL se encargar de generar la lgica de ejecucin SQL por nosotros en tiempo de ejecucin para que podamos interactuar y usar las entitades de datos. Podemos usar sintaxis de

consultas LINQ para indicar cmo consultar nuestro modelo de datos de forma fuertemente tipada. Crear clases entidad de la base de datos. Si ya tenemos un esquema de base de datos definido, podemos usarlo para crear clases entidad LINQ to SQL. La forma ms sencilla de conseguirlo es abrir la base de datos desde el Server Explorer de Visual Studio, seleccionar las tablas y vistas (Views) que queramos modelar, y arrastrarlas al diseador LINQ to SQL:

Cuando aadimos estas dos tablas (Categories y Products) y una vista (Invoices) de la base de datos Northwind al diseador de LINQ to SQL, tendremos las siguientes clases entidad creadas a partir del esquema de la base de datos:

Usando estas clases, podemos ejecutar todos los ejemplos de cdigo (excepto el de procedimientos almacenados) que vimos en la primera parte de esta serie sobre LINQ to SQL. No tenemos que aadir ningn cdigo adicional o configuracin para habilitar los escenarios de consulta, insercin, actualizacin, borrado, y paginacin en el servidor. Nombrado y pluralizacin Una de las cosas de las que os daris cuenta usanto el diseador de LINQ to SQL es que automticamente pluraliza los nombres de las tablas y columnas cuando crea las clases entidad basdas en el esquema de la base de datos. Por ejemplo: la tabla Products del ejemplo se resuelve en una clase Product, y la tabla Categories se resuelve en la clase Category. Este nombrado de clases hace que vuestro modelo sea ms consistente con las convenciones de nomenclatura de .NET, y encuentro bastante til que el diseador haga esto por mi (especialmente cuando aadimos muchas tablas a nuestro modelo). Si no os gusta el nombre de una clase o propiedad que el diseador ha generado, siempre podris cambiarlo por el que queris. Podis hacerlo editanto el nombre de la entidad/propiedad en el mismo diseador o cambiarlo en la rejilla de propiedades:

Esta habilidad de nombrado de entidades/propiedades/asociaciones es muy til en un gran nmero de casos. En particular: 1) Cuando cambie el nombre de una tabla/columna de vuestra base de datos. Como vuestras entidades tendrn nombres diferentes, podis decidir actualizar las reglas de mapeado y no el cdigo de vuestra aplicacin o las consultas para usar esas nuevas tablas/columnas. 2) Cuando en el esquema de la base de datos tengais nombres que no son limpios. Por ejemplo, en lugar de usar au_lname y au_fname para los nombres de las propiedades en una clase entidad, podis usar los nombres de LastName y FirstName en vuestras clases entidad y programar con esos nombres, en vez de cambiarlo en la base de datos. Relaciones Cuando arrastremos objetos del server explorer al diseador LINQ to SQL, Visual Studio comprobar las relaciones de clave primaria y ajenas de los objetos, y basndose en ellas crear relaciones por defecto entre las diferentes clases entidad que genere. Por ejemplo, cuando aadimos las tablas Products y Categories de la base de datos NorthWind al diseador LINQ to SQL podemos ver que se ha deducido una relacin de uno a n entre ellas (esto se indica con la felcha del navegador):

Esta relacin har que la clase entidad Product tenga una propiedad llamada Category que los desarrolladores usarn para acceder a la entidad Category para un Product dado. Tambin har que la clase Category tenga una coleccin de Products que permitir a los desarrolladores obtener todos los productos de una Category.

Si no nos gusta cmo el diseador a nombrado a la relacin, siempre podrmos cambiarlo. Slo hay que hacer clic en la felcha en el diseador, ver las propiedades y cambiar el nombre. Retrasar la carga LINQ to SQL permite a los desarrolladores especificar si las propiedades de las entidades deben precargarse o retrasarse hasta el primer acceso. Podemos personalizar las reglas

de precarga/retraso para las propiedades de las entidades seleccionando cualquier propiedad o asociacin en el diseador, y en las propiedades poner la propiedad Delay Loaded a true o false. Por poner un ejemplo, imaginemos la clase entidad Category del modelo anterior. La tabla Categories de la base de datos NorthWind tiene una columna Picture que contiene una imagen (potencialmente grande) para cada categora, y slo queremos esa imagen cuando vaya a usarla (y no cuando est haciendo una consulta para obtener los nombres de las categoras en una lista). Podramos configurar la propiedad Picture para que se retrase su carga seleccionandola en el diseador de LINQ to SQL y en las propiedades poner Delay Loaded a true:

Nota: Adems de configurar el significado de la precarga/retraso de las entidades, podemos sobreescribirlo va cdigo cuando hagamos consultas LINQ en las clases entidad (lo veremos en el siguiente post de esta serie). Usando procedimientos almacenados.

LINQ to SQL nos permite modelar procedimientos almacenados como mtodos de nuestra clase DataContext. Por ejemplo, supongamos que hemos definido un procedimiento almacenado simple para obtener la informacin de un producto de un categoryID:

Podemos usar el server explorer de Visual Studio y arrastrar este procedimiento almacenado al diseador de LINQ to SQL para obtener un mtodo fuertemente tipado que invocar a este procedimiento almacenado. Si lo arrastramos encima de la entidad Product en el diseador, el diseador declarar que el procedimiento almacenado devuelve un IEnumerable:

Podemos usar tanto una consulta SQL (que generar una consulta SQL adhoc) o invocar el procedimiento almacenado aadido para obtener las entidades product de la base de datos:

Usar procedimientos almacenados para actualizar/borrar/insertar datos. Por defecto LINQ to SQL crear automticamente expresiones SQL apropiadas para cuando tengamos que insertar/actualizar/borrar entidades. Por ejemplo, si escribimos el siguiente cdigo LINQ to SQL para actualizar algunos valores en una instancia de la entidad Product:

LINQ to SQL crear y ejecutar una sentencia UPDATE apropiada para cuando aceptemos los cambios (Veremos esto en ms profundidad en otros post).

Podemos definir procedimientos almacenados personalizados para INSERT, UPDATE, DELETE. Para configurar esto, hacemos clic en una entidad del diseador LINQ to SQL y en las propiedades de Delete/Insert/Update, en el botn , y ponemos un procedimiento almacenado que ya hayamos definido.

Lo curioso es que el cambio de estas propiedades se est realizando en la capa de mapeo de LINQ to SQL lo que implica que la actualizacin del cdigo que vimos ntes sigue funcionando sin tener que hacer ninguna modificacin. Con esto libramos a los desarrolladores de que si cambiamos el modelo de datos LINQ to SQL, no tienen que tocar ningn cdigo para que sigua funcionando si deciden poner un procedimiento almacenado personalizado. Resumen LINQ to SQL provee una forma limpia de modelar las capas de datos de nuestras aplicaciones. Una vez que tengamos nuestro modelado de datos, podemos realizar de forma eficiente consultas, inserciones, actualizaciones, y borrados sobre l. Con el diseador de LINQ to SQL que viene en Visual Studio y en Visual Web Developer Express podemos crear y administrar nuestros modelso de datos para LINQ to SQL extremadamente rpido. El diseador LINQ to SQL tambin permite una gran flexibilidad

que nos permite personalizar el comportamiento por defecto y sobreescribir/extender el sistema para que se adapte a nuestras necesidades. En prximos post usaremos este modelo que hemos creado para ver en ms detalle los procesos de consulta, inserciones, actualizaciones y borrados. En estos post tambin veremos cmo aadir validaciones negocio/datos personalizadas a las entidades que hemos diseado. Mike Taulty tiene una gran cantidad de videos sobre LINQ to SQL aqu, os recomiendo que los veis. As tenis una forma de aprender viendo cmo se usa LINQ to SQL.

LINQ to SQL (3 Parte Consultando la base de datos).NET, ASP .NET, LINQ, LINQ to SQL, Scott Guthri Add commentsjun

302007

El mes pasado empez una serie de post sobre LINQ to SQL. LINQ to SQL es un framework O/RM (Object relational mapping) que viene como parte del .NET Framework 3.5, que nos permite modelar de forma sencilla bases de datos relacionales con clases de .NET. Podemos usar, por tanto, expresiones LINQ tanto para consultar a la base de datos como para actualizar/inertar/borrar datos. Aqu tenis los enlaces a los primero dos post de esta serie:

Usando LINQ to SQL (1 Parte) LINQ to SQL (2 Parte Definiendo nuestras clases del modelo de datos)

En el post de hoy vamos a ver en ms detalle cmo usar el modelo de datos que creamos en la segunda parte, y veremos cmo usarlo para consultar datos en un proyecto ASP.NET. Modelo de la base de datos Northwind con LINQ to SQL En el segundo post de la serie vimos cmo crear un modelo de clases LINQ to SQL usando el diseador de LINQ to SQL que viene con VS 2008. Aqu tenis el modelo que creamos a partir de la base de datos de ejemplo Northwind:

Obteniendo productos. Una vez que tenemos definido nuestras clases del modelo de datos, podemos consultar y obtener fcilmente datos de nuestra base de datos. LINQ to SQL nos permite esto usando la sintxis de consultas de LINQ sobre la clase NorthwindDataContext que creamos con el diseador LINQ to SQL. Por ejemplo, para obtener e iterar sobre una secuencia de objetos Product podemos escribir el siguiente cdigo:

En esta consulta hemos usado la sentencia where en nuestra consulta LINQ para devolver aquellos productos de una categora. Estamos usando el campo/propiedad CategoryID del producto para hacer el filtro. Una de las cosas que nos aporta LINQ to SQL es que nos da una total flexibilidad en cmo consultar nuestros datos, y podemos aprovecharnos de las asociaciones que hicimos cuando modelamos las clases de LINQ to SQL para hacer consultas ms naturales y ricas sobre la base de datos. Por ejemplo, podemos modificar el filtro de la consulta por el CategoryName en lugar de por el CategoryID con la siguiente consulta LINQ:

Fijos en cmo estamos usando la propiedad Category de cada objeto Product para filtrarlos por CategoryName. Esta propiedad fue creada automticamente por LINQ to SQL ya que modelamos las clases Category y Product con una relacin varios a uno en la base de datos.

Por poner otro ejemplo del uso de las relaciones de nuestro modelo, podramos escribir la siguiente consulta LINQ para obtener aquellos productos que tengan ms de cinco rdenes para ellos:

Fijos cmo usamos la coleccin OrderDetails que LINQ to SQL cre en cada clase Product (debido a la relacin 1 a varios que modelamos en el diseador LINQ to SQL). Visualizando consultas LINQ to SQL en el debugger Los ORM como LINQ to SQL administran automticamente la creacin y la ejecucin del cdigo SQL cuando realizamos consultas o actualizaciones sobre su modelo de objetos. Una de los mayores preocupaciones que tienen los desarrolladores sobre los ORMs es pero qu cdigo SQL se est ejecutando? Una de las cosas que hace LINQ to SQL es poder ver exctamente qu cdigo SQL se est ejecutando cuando ejecutamos nuestra aplicacin con el debugger. Con la beta 2 de VS 2008 podemos usar el nuevo plug-in de visualizacin LINQ to SQL para ver (y testear) cualquier consulta LINQ to SQL. Simplemente aadimos un breakpoint y pasamos el ratn por encima y hacemos clic en la lupa para visualizar esa consulta:

ESto nos mostrar un cuadro de dilogo que nos dir exactamente la SQL que LINQ to SQL usar cuando se ejecute la consulta para obtener los objetos Product:

Si pulsamos el botn Execute de este dilogo nos permitir evaluar el SQL dentro del debugger y nos mostrar los resultados de la base de datos:

Obviamente esto hace realmente fcil ver qu lgica de consultas SQL est realizando LINQ to SQL. Fijos que podemos sobreescribir la SQL que LINQ to SQL ejecutar si queremos cambiarlo - sin embargo, en el 98% de los casos creo que os dareis cuenta de que el cdigo SQL que LINQ to SQL ejecuta es realmente bueno.

Enlazando consultas LINQ to SQL a controles ASP.NET Los resultados de las consultas LINQ implementa la interfaz IEnumerable la cual es una interfaz que los controles de servidor de ASP.NET soportan para enlazar datos. Lo que implica que podemos enlazar los resultados de cualquier consulta LINQ, LINQ to SQL, o LINQ to XML a cualquier control ASP.NET. Por ejemplo, podemos declarar un control en una pgina .aspx de la siguiente forma:

Luego, podemos enlazar los resultados de la consulta LINQ to SQL que escribimos antes:

Esto generar una pgina como la siguiente:

Restringiendo los resultados de la consulta. Hasta ahora, cuando evaluamos una consulta de productos, estamos obteniendo por defecto todas las columnas de datos necesarias para cubrir la entidad de Product. Por ejemplo, esta consulta para obtener productos:

El resultado de esta consulta es:

Normalmente slo queremos un subconjunto de los datos de cada producto. Podemos usar la nueva caracterstica que LINQ y los compiladores de C# y VB tienen para indicar que slo queremos un subconjunto de los datos, modificando la consulta LINQ to SQL de la siguiente forma:

Con esto obtendremos un subconjunto de los datos que se obtienen de la base de datos (como vemos con el visor del debugger):

Lo realmente til de LINQ to SQL es que podemos aprovecharnos de las asociaciones entre clases de nuestro modelo de datos cuando restringimos los datos. Esto nos permite expresar consultas tiles y muy eficientes. Por ejemplo, la siguiente consulta obtiene los ID y los nombres de la entidad Product, el nmero total de pedidos que hemos hecho de productos, y los suma al total de pedidos de Productos:

La expresin a la derecha de la propiedad Revenue es un ejemplo del uso del mtodo de extensinSum de LINQ. Toma una expresin Lambda que devuelve el valor de cada pedido de producto como argumento. LINQ to SQL es listo y es capaz de transformar la expresin LINQ anterior al siguiente SQL cuando es evaluado (con el visor del debugger):

La sentencia SQL anterior hace que los valores NumOrders y Revenue se calculen dentro del servidor SQL, y devuelve los siguientes valores de la base de datos (realmente rpido):

Podemos enlazar el resultado anterior a nuestro gridview:

BTW en caso de que os lo preguntis, tenemos intellisense en VS 2008 cuando escribimos estos tipos de restricciones en las consultas LINQ:

En este ejemplo estamos declarando un tipo annimo que usa la inicializacin de objetos para amoldar y definir la estructura del resultado. Y seguimos teniendo intellisense en VS 2008, chequeo de compilacin y soporte para refactoring con estos tipos anonimos:

Paginando los resultados de la consulta. Una de las necesidades ms comunes en entornos web es la posibilidad de hacer eficientemente la paginancin en las interfaces de usuario. LINQ tiene dos mtodos de extensin que permite hacer esto de forma fcil y eficiente los mtodos Skip() y Take(). Podemos usar los mtodos Skip() y Take() para indicar que slo queremos devolver 10 objetos producto desde la fila que le pasemos como argumento:

Fijos que no aadimos ni Skipt() ni Take() en la primera consulta sino que lo hacemos despus de la consulta (cuando lo enlazamos a la fuente de datos del GridView). Muchos me preguntan pero esto no significa que primero obtiene todos los datos de la base de datos y luego hace la paginacin (esto es malo)? No. La cuestin es que LINQ usa un modelo de ejecucin en diferido, es decir, la consulta no se ejecuta hasta que se itera sobre los resultados. Uno de los beneficios de este modelo de ejecucin en diferido es que nos permite crear consultas en varias lneas de cdigo (lo que mejora la claridad). Tambin nos permite crear las consultas despus de otras lo que nos permite composiciones ms flexibles y reutilizacin. Una vez que tenemos el mtodo BindProduct(), podemos escribir el siguiente cdigo en nuestra pgina para obtener el ndice de inicio de la consulta y hacer que los productos sean paginados y mostrados en el gridview:

Esto nos dar una pgina de productos, filtrada para mostrar aquellos productos que tengan ms de cinco pedidos, mostrando datos calculados dinmicamente, y que son paginables a partir de una cadena de consulta:

Nota: Cuando trabajamos contra SQL 2005, LINQ to SQL usar la funcin SQL ROW_NUMBER() para crear toda la lgica de paginacin en la base de datos. Esto nos asegura que slo devolver las 10 filas de datos que queremos mostrar en la pgina:

Esto hace realmente fcil y eficiente navegar por grandes cantidades de datos. Resumen Hemos visto por encima alguna de las cosas que LINQ to SQL nos ofrece. Para aprender ms sobre expresiones LINQ y las nuevas caractersticas de consultas que traen los compiladores de C# y VB con VS 2008, leed estos post:

Nuevas caractersticas de la nueva versin de C# Orcas Mtodos de extensin. Expresiones Lambda Sintaxis de consultas Tipos annimos

En el prximo post de esta serie sobre LINQ to SQL veremos cmo podemos aadir lgica de validacin a nuestro modelo de clases de datos, y mostraremos cmo podemos usarlo para encapsular la lgica de negocio que se ejecutar con cada actualizacin, insercin o borrado de nuestros datos. Veremos casos ms avanzados, cmo usar el nuevo control para aadir enlaces de datos declarativos a controles ASP.NET, resolucin de errores de concurrencia optimista, y ms.