Vous êtes sur la page 1sur 18

23/8/2017 LINQ to SQL (3 Parte Consultando la base de datos) | Speaking in .

NET

LINQ to SQL (3 Parte Consultando la base de


datos)
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 (1Parte)


LINQ to SQL (2 Parte - De niendo nuestras clases del modelo dedatos)

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:

http://speakingin.net/2007/06/30/linq-to-sql-3%C2%AA-parte-consultando-la-base-de-datos/ 1/18
23/8/2017 LINQ to SQL (3 Parte Consultando la base de datos) | Speaking in .NET

Obteniendo productos.

Una vez que tenemos de nido 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:

http://speakingin.net/2007/06/30/linq-to-sql-3%C2%AA-parte-consultando-la-base-de-datos/ 2/18
23/8/2017 LINQ to SQL (3 Parte Consultando la base de datos) | Speaking in .NET

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
ltro.

Una de las cosas que nos aporta LINQ to SQL es que nos da una total exibilidad 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
modi car el ltro 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 ltrarlos 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:

http://speakingin.net/2007/06/30/linq-to-sql-3%C2%AA-parte-consultando-la-base-de-datos/ 3/18
23/8/2017 LINQ to SQL (3 Parte Consultando la base de datos) | Speaking in .NET

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:

http://speakingin.net/2007/06/30/linq-to-sql-3%C2%AA-parte-consultando-la-base-de-datos/ 4/18
23/8/2017 LINQ to SQL (3 Parte Consultando la base de datos) | Speaking in .NET

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 <asp:gridview> en una pgina .aspx de la siguiente forma:

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

http://speakingin.net/2007/06/30/linq-to-sql-3%C2%AA-parte-consultando-la-base-de-datos/ 5/18
23/8/2017 LINQ to SQL (3 Parte Consultando la base de datos) | Speaking in .NET

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:

http://speakingin.net/2007/06/30/linq-to-sql-3%C2%AA-parte-consultando-la-base-de-datos/ 6/18
23/8/2017 LINQ to SQL (3 Parte Consultando la base de datos) | Speaking in .NET

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, modi cando 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):

http://speakingin.net/2007/06/30/linq-to-sql-3%C2%AA-parte-consultando-la-base-de-datos/ 7/18
23/8/2017 LINQ to SQL (3 Parte Consultando la base de datos) | Speaking in .NET

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
e cientes. Por ejemplo, la siguiente consulta obtiene los ID ylos 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 extensin
"Sum" 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):

http://speakingin.net/2007/06/30/linq-to-sql-3%C2%AA-parte-consultando-la-base-de-datos/ 8/18
23/8/2017 LINQ to SQL (3 Parte Consultando la base de datos) | Speaking in .NET

La sentencia SQL anterior haceque los valoresNumOrders 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:

http://speakingin.net/2007/06/30/linq-to-sql-3%C2%AA-parte-consultando-la-base-de-datos/ 9/18
23/8/2017 LINQ to SQL (3 Parte Consultando la base de datos) | Speaking in .NET

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

http://speakingin.net/2007/06/30/linq-to-sql-3%C2%AA-parte-consultando-la-base-de-datos/ 10/18
23/8/2017 LINQ to SQL (3 Parte Consultando la base de datos) | Speaking in .NET

En este ejemplo estamos declarando un tipo annimo que usa la inicializacin de objetos para amoldar y
de nir 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 e cientemente la


paginancin en las interfaces de usuario. LINQ tiene dos mtodos de extensin que permite hacer esto
de forma fcil y e ciente - los mtodos Skip() y Take().

Podemos usar los mtodos Skip() y Take() para indicar que slo queremos devolver 10 objetos producto
- desde la la que le pasemos como argumento:

http://speakingin.net/2007/06/30/linq-to-sql-3%C2%AA-parte-consultando-la-base-de-datos/ 11/18
23/8/2017 LINQ to SQL (3 Parte Consultando la base de datos) | Speaking in .NET

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
signi ca 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 bene cios de este modelo deejecucin en diferido es que nos permite crear consultasen
varias lneas de cdigo (lo que mejora la claridad). Tambin nos permite crear las consultas despus
de otras - lo que nos permite composiciones ms exibles 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, ltrada 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:

http://speakingin.net/2007/06/30/linq-to-sql-3%C2%AA-parte-consultando-la-base-de-datos/ 12/18
23/8/2017 LINQ to SQL (3 Parte Consultando la base de datos) | Speaking in .NET

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 las de
datos que queremos mostrar en la pgina:

Esto hace realmente fcil y e ciente navegar por grandes cantidades de datos.

http://speakingin.net/2007/06/30/linq-to-sql-3%C2%AA-parte-consultando-la-base-de-datos/ 13/18
23/8/2017 LINQ to SQL (3 Parte Consultando la base de datos) | Speaking in .NET

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 deextensin.
ExpresionesLambda
Sintaxis deconsultas
Tiposannimos

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 <asp:LINQDataSource> para aadir enlaces
de datos declarativos a controles ASP.NET, resolucin de errores de concurrencia optimista, y ms.

Espero que sirva.

Scott.

Traducido por: Juan Mara La Ramos. Microsoft Student Partner.

toH tlhIngan Hol DajatlhlaH e DaneHa?

Comparte esto:

Facebook 4 Twitter LinkedIn Ms

Esta entrada fue publicada en .NET, ASP .NET, LINQ, LINQ to SQL, Scott Guthri el 30 Junio, 2007
[http://speakingin.net/2007/06/30/linq-to-sql-3%c2%aa-parte-consultando-la-base-de-datos/] .

20 pensamientos en LINQ to SQL (3 Parte Consultando la base de datos)

Pingback: Visor de Debugging de LINQ to SQL Thinking in .NET

Pingback: El control asp:ListView (Parte 1 - Creacin de una pgina de listado de productos con una CSS
limpia Thinking in .NET

Pingback: LINQ to SQL (Parte 6 - Obtener datos con procedimientos almacenados) Thinking in .NET

http://speakingin.net/2007/06/30/linq-to-sql-3%C2%AA-parte-consultando-la-base-de-datos/ 14/18
23/8/2017 LINQ to SQL (3 Parte Consultando la base de datos) | Speaking in .NET

abarm lincoln
11 Septiembre, 2008 en 14:52

deberias poner el codigo en texto no en imagenes lkj kfdjlsdkfjaldkjasld

maestro
19 Enero, 2010 en 20:35

vale callampa este ejemplo no se ve bien el codigo


saludos jajajajaj

Pingback: ASP.NET MVC Framework (Primera parte) Thinking in .NET

Darko
28 Julio, 2010 en 18:30

Muchas gracias, no es necesario el codigo anexo, pues para un programador principiante esta apenas
entendible, ( yo lo soy, y entiendo ).

Muchas gracias, logre emplear uno que otro ejercicio de manera exitosa,
( claro despues de leer varias veces y seguir paso a paso jaja )

El secreto para entender algo, es dejar el afan y ponerte a ensayar.

Muchas gracias.

esteban
15 Diciembre, 2010 en 15:39

Hola, podrias terminar de ingresar el codigo que no entro completo en la imagen de la paginacin, dice asi:
protected void Page_Load(object sender, EventArgs e)
{
int startrow = Convert.ToInt32(Request.QueryString[ ?????????

Muy buenos los post, soy principiante y pude realizar todos los ejercicios hasta este nivel sin problemas.

http://speakingin.net/2007/06/30/linq-to-sql-3%C2%AA-parte-consultando-la-base-de-datos/ 15/18
23/8/2017 LINQ to SQL (3 Parte Consultando la base de datos) | Speaking in .NET

esteban
15 Diciembre, 2010 en 16:14

Me di cuenta que si copio y pego las imagenes en el paint o algun otro programa me sale el codigo
completo. Me lo estaba tapando la linea gris de la derecha. Gracias igual. Muy bueno el efecto de la nieve!!!

Omar
8 Febrero, 2011 en 14:27

Hola, tengo una duda, como puedo colocar valores devueltos en un grupo de textbox?, ya que solo
aparecen ejemplos para llenar un gridView o cuando solo devuelve un dato.
Saludos.

Juanma
8 Febrero, 2011 en 20:14

Hola Omar, una vez que tengas el dato que te interesa no tienes ms que hacer un textbox.Text=
miProducto.Nombre,
Si tienes varios textbox vas a tener que hacerlo uno a uno, o arreglartelas para hacerlo con un repeater:
http://msdn.microsoft.com/es-es/library/zzx23804(VS.80).aspx

Leonel
10 Agosto, 2011 en 1:23

Excelente tutorial compaero, muchas gracias por compartir tus conocimientos con personas como yo que
estn ansiosos en aprender programacin.
Tengo una consulta, y es que deseo saber como realizar un ltro en tiempo de ejecucin a un datagrid
llenado con una consulta en LINQ, lo que deseo es que en un textbox en el momento de ir ingresando
letras desde el ordenador el valla ltrando los valores de acuerdo a orden en que estoy escribiendo.

De antemano muchas gracias por la ayuda brindada.

http://speakingin.net/2007/06/30/linq-to-sql-3%C2%AA-parte-consultando-la-base-de-datos/ 16/18
23/8/2017 LINQ to SQL (3 Parte Consultando la base de datos) | Speaking in .NET

Pedro Sandoval
7 Marzo, 2012 en 23:43

Estoy desarrollando una aplicacion muy similar a orden de compra cuando hago cambios en las cantidades
de los productos en el detalle se graban bien en la tabla pero cuando limpio la pantalla para llamar a otro y
decido llamar al mismo que estaba trabajando me trae los datos bien pero las cantidades de los detalles
que habia cambiado pero las anteriores ( Nota estoy trabajando con vs-20120 con sql-2008 ) y las consultas
la hago con LINQ . paraece que hay un desface entre la BD y el modelo Linq ?

Juanma Autor

8 Marzo, 2012 en 16:15

Llamas a submitChanges() ntes de limpiar la pantalla?

Carlos
1 Octubre, 2012 en 8:58

Hola alguien sabe como puedo pasar los campos de un registro de una consulta a correspondientes
textbox en mi interfaz es decir lo que quiero por ejemplo si realizo una consulta en mi tabla
cuentasDeServiciosTab con los campos nombre,apellidos,email,telefono etc, que en un textbox pueda
mostrar el nombre en otro el apellido y asi sucesivamente es que todos los manuales y paginas siempre
llenan datagrids o gridview, y he buscado por dias y no logro encontrar algo que supongo q debe ser
basico, por su ayuda mil gracias

Juanma Autor

1 Octubre, 2012 en 9:00

Hola Carlos, si te he entendido bien deberas hacer:


miTextBox.Text=mi nombre
Y as con todos y cada uno de los campos que te interese.
Espero que sirva

http://speakingin.net/2007/06/30/linq-to-sql-3%C2%AA-parte-consultando-la-base-de-datos/ 17/18
23/8/2017 LINQ to SQL (3 Parte Consultando la base de datos) | Speaking in .NET

John
3 Octubre, 2012 en 7:17

Muy Bueno, felicidades.

John
3 Octubre, 2012 en 7:22

Increible

isacko
17 Enero, 2013 en 20:09

Muchas gracias x compartir y tomarte el tiempo para explicarlo detalladamente! Muy buen post!

mariano
4 Abril, 2014 en 20:55

jate que se te descon guro todo el texto, pero mas alla de eso, genial aporte

Los comentarios estn cerrados.

http://speakingin.net/2007/06/30/linq-to-sql-3%C2%AA-parte-consultando-la-base-de-datos/ 18/18

Vous aimerez peut-être aussi