SlideShare una empresa de Scribd logo
1 de 6
Descargar para leer sin conexión
LINQ to SQL (Parte 8 – Ejecutar consultas SQL personalizadas) 
4 respuestas 
En las últimas semanas he escrito una serie de post sobre LINQ to SQL. LINQ to SQL es un ORM que viene con .NET 3.5, y nos permite modelar bases de datos relacionales en clases. Podemos usar expresiones LINQ para consultar la base de datos y también para actualizar, insertar y borrar datos. 
Aquí teneis los enlaces a los diferentes post de la serie: 
 Parte 1: Introducción a LINQ to SQL 
 Parte 2: Definiendo el modelo de datos. 
 Parte 3: Consultando la base de datos 
 Parte 4: Actualizando la base de datos. 
 Parte 5: Enlazar controles de interfaz de usuario con el ASP:LinqDatSource 
 Parte 6: Obtener datos con procedimientos almacenados. 
 Parte 7: Actualizando la base de datos con procedimientos almacenados. 
En los dos últimos post vismo cómo podemos usar los procedimientos almacenados de nuestra base de datos para consultar, insertar, actualizar y borrar datos con el modelo de LINQ to SQL. 
Una pregunta que me han hecho mucho desde que he escrito estos post es: ¿que pasa si quiero control total sobre las consultas SQL que usa LINQ to SQL - pero no quiero usar SPROCs para hacerlo? En el post de hoy veremos eso - y veremos cómo podemos usar expresiones SQL personalizadas para que LINQ to SQL las use en lugar de las que generaría él. 
Uso de expresiones LINQ con LINQ to SQL. 
Supongamos que hemos usado el diseñador de LINQ to SQL de VS 2008 para modelar un conjunto de clases a partir de la base de datos Northwind (esto lo vimos en el segundo post de la serie):
En el tercer post vimos cómo podemos usar LINQ con las nuevas características de VB y C# para consultar el modelo de clases y devolver un conjunto de objetos que representan las filas y columnas de la base de datos. 
Por ejemplo, podemos añadir un método a la clase DataContext "GetProductsByCategory" que usa una consulta LINQ para devolver objetos de Products de la base de datos: 
VB: 
c#:
Una vez definido nuestro método de LINQ, podemos escribir el siguiente código para obtener productos e iterar sobre ellos: 
VB: 
Cuando se evalúa la expresión LINQ del método "GetProductsByCategory", el ORM LINQ to SQL ejectuará un SQL dinámico para obtener los datos de la tabla Product para crear los objetos Product. Podeis usar el Visualizador de Debug de LINQ to SQL para ver en el debugger cuál es la expresión LINQ que se ejectuará. 
Uso de consultas SQL personalizadas con LINQ to SQL 
En el ejemplo de arriba no tenemos que escribir ningún código SQL para consultar y obtener objetos Product fuertemente tipados. LINQ to SQL traduce la expresión LINQ a SQL por nosotros. 
¿Pero que pasa si queremos un control total sobre el SQL que se está ejecutando en nuestra base de datos, y no queremos que LINQ to SQL lo haga por nosotros? Una forma de conseguir esto es usando SPROC como ya vimos en las partes 6 y 7 de esta serie. La otra forma es usar el método auxiliar "ExecuteQuery" de la clase DataContext y usar una expresión SQL personalizada que le demos. 
Usando el método ExecuteQuery 
El método ExecuteQuery toma una expresión SQL como argumento , con un conjunto de parámetros, y la ejecuta contra la base de datos (incluyendo JOINs personalizados sobre varias tablas.
Lo que hace que ExecuteQuery sea tan útil es que nos permite especifiar cómo queremos devolver los valores de la expresión SQL. Podemos hacer esto pasándole un parámetro tipado al método o usando una versión genérica del método. 
Por ejemplo, podemos cambiar el método GetProductsByCategory() que creamos ántes -con una expresión LINQ- para que use el método ExecuteQuery para ejectuar un SQL que nosotros le digamos: 
VB: 
C#: 
Ahora podemos llamar al método GetProductsByCategory() de la misma forma que ántes: 
De esta manera será nuestra consulta SQL la que se ejecutará contra la base de datos - y no el SQL dinámico que generaría la expresión LINQ. 
SQL personalizado y tracking de objetos para las actualizaciones 
Por defecto cuando obtenemos objetos con LINQ to SQL, se hace un tracking sobre los cambios que les hacemos. Si llamamos al método "SubmitChanges()" guardará los datos de forma transaccional en la base de datos. Vismo esto en la cuarta parte de esta serie de post. 
Una de las característcias del metodo ExecuteQuery() es que participa en este tracking de objetos para actualizar el modelo. Por ejemplo, podemos escribir el siguiente código para obtener todos los productos de una categoría y rebajar los precios un 10%:
Como dijimos que el tipo de resultado del ExecuteQuery en el método GetProductsByCategory fuese "Product, LINQ to SQL sabe cómo guardar los cambios. Y cuando llamemos a SubmitChanges los guardará. 
SQL personalizado con clases personalizadas. 
El método ExecuteQuery nos permite especificar cualquier clase como tipo de resultado de la consulta SQL. La clase no tiene porqué haberse creado con el diseñador LINQ to SQL, o implementar ninguna interfaz. 
Por ejemplo, definimos la clase ProductSummary con un subconjunto de las propiedades de Product (fijáos que hemos usado la característica de propiedades automáticas): 
Podríamos crear otro método en nuestro DataContext llamado GetProductSummariesByCategory() que nos devuelva objetos de esa clase. Fijáos cómo la siguiente SQL obtiene sólo un subconjunto de Product - El método ExecuteQuery() se encarga de mapea automáticamente las propiedades a objetos de la clase ProductSumary: 
Ahora podemos invocar a este método e iterar sobre los resultados con el siguiente codigo: 
SQL personalizadas para inserciones, actualizaciones y borrados. 
Además de usar SQL personalizadas para consultar datos, también podemos hacerlas para insertar, actualizar y borrar datos.
Esto lo conseguimos creando los métodos parciales adecuados para cada operacion para la entidad que queramos cambiar en nuestra clase DataContext. Podemos usar el método ExecuteCommand del DataContext para escribir el SQL que queramos. Por ejemplo, para sobreescribir el comportamiento de borrado de la clase Product definimos el siguiente método parcial: 
Y si escribimos un código que elimine un producto de la base de datos, LINQ to SQL llamará al método DeleteProduct - que ejecutará una SQL personalizada en lugar del SQL dinámico que LINQ to SQL usaría: 
Resumen 
El ORM LINQ to SQL genera y ejectua un SQL dinámico para las consultas, actualizaciones, inserciones y borrados contra la base de datos. 
Para escenarios más avanzados, o en caso donde queramos un control total sobre el SQL que se ejecuta, también podemos personalizar el ORM para que ejecute SPROCs, o nuestras consultas SQL personalizadas. Esto nos da una gran flexibilidad a la hora de construir y extender nuestra capa de datos. 
En próximos post veremos algunos conceptos de LINQ to SQL como: Herenacia simple de talbas, carga a petición, concurrencia optimista, y escenarios de N-capas.

Más contenido relacionado

La actualidad más candente

Actividad 1 Programación Net III
Actividad 1 Programación Net IIIActividad 1 Programación Net III
Actividad 1 Programación Net IIIJANETNuez5
 
Manual de creacion de un publicador en MS SQL SERVER 2008:: Publicador
Manual de creacion de un publicador en  MS SQL SERVER 2008:: PublicadorManual de creacion de un publicador en  MS SQL SERVER 2008:: Publicador
Manual de creacion de un publicador en MS SQL SERVER 2008:: PublicadorFranklin Cando
 
Conectar java con una base de datos
Conectar java con una base de datosConectar java con una base de datos
Conectar java con una base de datosjbersosa
 
Introduccion a-linq..www.freelibros.com
Introduccion a-linq..www.freelibros.comIntroduccion a-linq..www.freelibros.com
Introduccion a-linq..www.freelibros.comSimon Camacho
 
Instalación del conector de MySQL para Visual Studio
Instalación del conector de MySQL para Visual StudioInstalación del conector de MySQL para Visual Studio
Instalación del conector de MySQL para Visual StudioYoshuaZea
 
Bases de datos mysql y repotes usando jasper report
Bases de datos mysql y repotes usando jasper reportBases de datos mysql y repotes usando jasper report
Bases de datos mysql y repotes usando jasper reportjbersosa
 
Continuación 3 de la creación de reportes con jasper report
Continuación 3 de la creación de reportes con jasper reportContinuación 3 de la creación de reportes con jasper report
Continuación 3 de la creación de reportes con jasper reportjbersosa
 
Guia 1 conexion a base de datos sql server
Guia 1 conexion a base de datos sql serverGuia 1 conexion a base de datos sql server
Guia 1 conexion a base de datos sql serverMayito CH
 
Tutorial de jpa para windows usando net beans y mysql parte 1
Tutorial de jpa para windows usando net beans y mysql parte 1Tutorial de jpa para windows usando net beans y mysql parte 1
Tutorial de jpa para windows usando net beans y mysql parte 1Henry Mendoza Puerta
 

La actualidad más candente (19)

Conectarse a mysql
Conectarse a mysqlConectarse a mysql
Conectarse a mysql
 
Conexion del jpa con mysql
Conexion del jpa con mysqlConexion del jpa con mysql
Conexion del jpa con mysql
 
Actividad 1 Programación Net III
Actividad 1 Programación Net IIIActividad 1 Programación Net III
Actividad 1 Programación Net III
 
Manual de creacion de un publicador en MS SQL SERVER 2008:: Publicador
Manual de creacion de un publicador en  MS SQL SERVER 2008:: PublicadorManual de creacion de un publicador en  MS SQL SERVER 2008:: Publicador
Manual de creacion de un publicador en MS SQL SERVER 2008:: Publicador
 
Statement
StatementStatement
Statement
 
ORACLE SQL
ORACLE SQLORACLE SQL
ORACLE SQL
 
Prepared statement
Prepared statementPrepared statement
Prepared statement
 
Conectar java con una base de datos
Conectar java con una base de datosConectar java con una base de datos
Conectar java con una base de datos
 
Introduccion a-linq..www.freelibros.com
Introduccion a-linq..www.freelibros.comIntroduccion a-linq..www.freelibros.com
Introduccion a-linq..www.freelibros.com
 
Instalación del conector de MySQL para Visual Studio
Instalación del conector de MySQL para Visual StudioInstalación del conector de MySQL para Visual Studio
Instalación del conector de MySQL para Visual Studio
 
Espacio de nombres system.data.sqlclient
Espacio de nombres system.data.sqlclientEspacio de nombres system.data.sqlclient
Espacio de nombres system.data.sqlclient
 
Textos sqli_mssql
 Textos sqli_mssql Textos sqli_mssql
Textos sqli_mssql
 
Bases de datos mysql y repotes usando jasper report
Bases de datos mysql y repotes usando jasper reportBases de datos mysql y repotes usando jasper report
Bases de datos mysql y repotes usando jasper report
 
Continuación 3 de la creación de reportes con jasper report
Continuación 3 de la creación de reportes con jasper reportContinuación 3 de la creación de reportes con jasper report
Continuación 3 de la creación de reportes con jasper report
 
ORACLE SQL
ORACLE SQLORACLE SQL
ORACLE SQL
 
Dprn3 u3 a1_eeul
Dprn3 u3 a1_eeulDprn3 u3 a1_eeul
Dprn3 u3 a1_eeul
 
Guia 1 conexion a base de datos sql server
Guia 1 conexion a base de datos sql serverGuia 1 conexion a base de datos sql server
Guia 1 conexion a base de datos sql server
 
My sql
My sqlMy sql
My sql
 
Tutorial de jpa para windows usando net beans y mysql parte 1
Tutorial de jpa para windows usando net beans y mysql parte 1Tutorial de jpa para windows usando net beans y mysql parte 1
Tutorial de jpa para windows usando net beans y mysql parte 1
 

Similar a Linq to sql 8

Similar a Linq to sql 8 (20)

Linq to sql 6
Linq to sql 6Linq to sql 6
Linq to sql 6
 
Linq to sql 9
Linq to sql 9Linq to sql 9
Linq to sql 9
 
Linq to sql 7
Linq to sql 7Linq to sql 7
Linq to sql 7
 
Linq to sql 2
Linq to sql 2Linq to sql 2
Linq to sql 2
 
Linq to sql 4
Linq to sql 4Linq to sql 4
Linq to sql 4
 
Linq to sql 3
Linq to sql 3Linq to sql 3
Linq to sql 3
 
Linq to sql 5
Linq to sql 5Linq to sql 5
Linq to sql 5
 
Ejemplo Linq To SQL
Ejemplo Linq To SQLEjemplo Linq To SQL
Ejemplo Linq To SQL
 
Tema 9 aplicaciones de dos capas por gio
Tema 9   aplicaciones de dos capas por gioTema 9   aplicaciones de dos capas por gio
Tema 9 aplicaciones de dos capas por gio
 
Conexion
ConexionConexion
Conexion
 
Tema 15 aplicaciones de dos capas por gio
Tema 15   aplicaciones de dos capas por gioTema 15   aplicaciones de dos capas por gio
Tema 15 aplicaciones de dos capas por gio
 
Guía herramientas de BD PHP
Guía herramientas de BD PHPGuía herramientas de BD PHP
Guía herramientas de BD PHP
 
Guia herramientas de bd
Guia herramientas de bdGuia herramientas de bd
Guia herramientas de bd
 
Java con base de datos
Java con base  de datosJava con base  de datos
Java con base de datos
 
ANDROID CON CONEXIÓN A BASE DE DATOS SQLITE
ANDROID CON CONEXIÓN A BASE DE DATOS SQLITEANDROID CON CONEXIÓN A BASE DE DATOS SQLITE
ANDROID CON CONEXIÓN A BASE DE DATOS SQLITE
 
Ejemplo bbdd sqlite (android)
Ejemplo bbdd sqlite (android)Ejemplo bbdd sqlite (android)
Ejemplo bbdd sqlite (android)
 
Espacio de nombres system.data.sql client
Espacio de nombres system.data.sql clientEspacio de nombres system.data.sql client
Espacio de nombres system.data.sql client
 
Aplicación abc. asp net mvc 3
Aplicación abc. asp net mvc 3Aplicación abc. asp net mvc 3
Aplicación abc. asp net mvc 3
 
Java con base de datos
Java con base de datosJava con base de datos
Java con base de datos
 
JAVA CON BASE DE DATOS
JAVA CON BASE DE DATOSJAVA CON BASE DE DATOS
JAVA CON BASE DE DATOS
 

Más de jcfarit

Conceptos basicos de telefonia
Conceptos basicos de telefoniaConceptos basicos de telefonia
Conceptos basicos de telefoniajcfarit
 
Manual de usuario Ruani
Manual de usuario RuaniManual de usuario Ruani
Manual de usuario Ruanijcfarit
 
Unidad 3 gestion de procesos en linux
Unidad 3 gestion de procesos en linuxUnidad 3 gestion de procesos en linux
Unidad 3 gestion de procesos en linuxjcfarit
 
Arquitectura General del Sistema Operativo Linux
Arquitectura General del Sistema Operativo LinuxArquitectura General del Sistema Operativo Linux
Arquitectura General del Sistema Operativo Linuxjcfarit
 
ISO 27001 -6
ISO 27001 -6ISO 27001 -6
ISO 27001 -6jcfarit
 
ISO 27001 - 5
ISO 27001 - 5ISO 27001 - 5
ISO 27001 - 5jcfarit
 
ISO 27001 4
ISO 27001 4ISO 27001 4
ISO 27001 4jcfarit
 
ISO 27001 -3
ISO 27001 -3 ISO 27001 -3
ISO 27001 -3 jcfarit
 
ISO 27001
ISO 27001ISO 27001
ISO 27001jcfarit
 
ISO 27001
ISO 27001ISO 27001
ISO 27001jcfarit
 
Curso ubuntuimprimible
Curso ubuntuimprimibleCurso ubuntuimprimible
Curso ubuntuimprimiblejcfarit
 
Curso ubuntu1extraimprimible
Curso ubuntu1extraimprimibleCurso ubuntu1extraimprimible
Curso ubuntu1extraimprimiblejcfarit
 
Autentificación-Firma Digital
Autentificación-Firma DigitalAutentificación-Firma Digital
Autentificación-Firma Digitaljcfarit
 
Auditoría de Routers y Switches
Auditoría de Routers y SwitchesAuditoría de Routers y Switches
Auditoría de Routers y Switchesjcfarit
 
Arquitectura multi agente.doc
Arquitectura multi agente.docArquitectura multi agente.doc
Arquitectura multi agente.docjcfarit
 
Aplicaciones Criptográficas en Entornos Económicos
Aplicaciones Criptográficas en Entornos EconómicosAplicaciones Criptográficas en Entornos Económicos
Aplicaciones Criptográficas en Entornos Económicosjcfarit
 
Análisis de los sistemas de dinero electrónico
Análisis de los sistemas de dinero electrónicoAnálisis de los sistemas de dinero electrónico
Análisis de los sistemas de dinero electrónicojcfarit
 
Guia plan de_clases
Guia plan de_clasesGuia plan de_clases
Guia plan de_clasesjcfarit
 
Los medios de enseñanza aprendizaje
Los medios de enseñanza aprendizajeLos medios de enseñanza aprendizaje
Los medios de enseñanza aprendizajejcfarit
 

Más de jcfarit (20)

Conceptos basicos de telefonia
Conceptos basicos de telefoniaConceptos basicos de telefonia
Conceptos basicos de telefonia
 
Manual de usuario Ruani
Manual de usuario RuaniManual de usuario Ruani
Manual de usuario Ruani
 
Unidad 3 gestion de procesos en linux
Unidad 3 gestion de procesos en linuxUnidad 3 gestion de procesos en linux
Unidad 3 gestion de procesos en linux
 
Arquitectura General del Sistema Operativo Linux
Arquitectura General del Sistema Operativo LinuxArquitectura General del Sistema Operativo Linux
Arquitectura General del Sistema Operativo Linux
 
ISO 27001 -6
ISO 27001 -6ISO 27001 -6
ISO 27001 -6
 
ISO 27001 - 5
ISO 27001 - 5ISO 27001 - 5
ISO 27001 - 5
 
ISO 27001 4
ISO 27001 4ISO 27001 4
ISO 27001 4
 
ISO 27001 -3
ISO 27001 -3 ISO 27001 -3
ISO 27001 -3
 
ISO 27001
ISO 27001ISO 27001
ISO 27001
 
ISO 27001
ISO 27001ISO 27001
ISO 27001
 
Curso ubuntuimprimible
Curso ubuntuimprimibleCurso ubuntuimprimible
Curso ubuntuimprimible
 
Curso ubuntu1extraimprimible
Curso ubuntu1extraimprimibleCurso ubuntu1extraimprimible
Curso ubuntu1extraimprimible
 
Autentificación-Firma Digital
Autentificación-Firma DigitalAutentificación-Firma Digital
Autentificación-Firma Digital
 
Auditoría de Routers y Switches
Auditoría de Routers y SwitchesAuditoría de Routers y Switches
Auditoría de Routers y Switches
 
Arquitectura multi agente.doc
Arquitectura multi agente.docArquitectura multi agente.doc
Arquitectura multi agente.doc
 
Aplicaciones Criptográficas en Entornos Económicos
Aplicaciones Criptográficas en Entornos EconómicosAplicaciones Criptográficas en Entornos Económicos
Aplicaciones Criptográficas en Entornos Económicos
 
Análisis de los sistemas de dinero electrónico
Análisis de los sistemas de dinero electrónicoAnálisis de los sistemas de dinero electrónico
Análisis de los sistemas de dinero electrónico
 
Suneval
SunevalSuneval
Suneval
 
Guia plan de_clases
Guia plan de_clasesGuia plan de_clases
Guia plan de_clases
 
Los medios de enseñanza aprendizaje
Los medios de enseñanza aprendizajeLos medios de enseñanza aprendizaje
Los medios de enseñanza aprendizaje
 

Último

COMPETENCIAS CIUDADANASadadadadadadada .pdf
COMPETENCIAS CIUDADANASadadadadadadada .pdfCOMPETENCIAS CIUDADANASadadadadadadada .pdf
COMPETENCIAS CIUDADANASadadadadadadada .pdfOscarBlas6
 
Buscadores, SEM SEO: el desafío de ser visto en la web
Buscadores, SEM SEO: el desafío de ser visto en la webBuscadores, SEM SEO: el desafío de ser visto en la web
Buscadores, SEM SEO: el desafío de ser visto en la webDecaunlz
 
COMOGANARAMIGODPARACRISTOIGLESIAADVENTISTANECOCLI,COM
COMOGANARAMIGODPARACRISTOIGLESIAADVENTISTANECOCLI,COMCOMOGANARAMIGODPARACRISTOIGLESIAADVENTISTANECOCLI,COM
COMOGANARAMIGODPARACRISTOIGLESIAADVENTISTANECOCLI,COMcespitiacardales
 
libro de Ciencias Sociales_6to grado.pdf
libro de Ciencias Sociales_6to grado.pdflibro de Ciencias Sociales_6to grado.pdf
libro de Ciencias Sociales_6to grado.pdfFAUSTODANILOCRUZCAST
 
Institucion educativa la esperanza sede la magdalena
Institucion educativa la esperanza sede la magdalenaInstitucion educativa la esperanza sede la magdalena
Institucion educativa la esperanza sede la magdalenadanielaerazok
 
12 Clasificacion de las Computadoras.pdf
12 Clasificacion de las Computadoras.pdf12 Clasificacion de las Computadoras.pdf
12 Clasificacion de las Computadoras.pdfedwinmelgarschlink2
 
NUVO PROGRAMAS DE ESCUELAS NUEVO-ACUERDO-CTE.pdf
NUVO PROGRAMAS DE ESCUELAS NUEVO-ACUERDO-CTE.pdfNUVO PROGRAMAS DE ESCUELAS NUEVO-ACUERDO-CTE.pdf
NUVO PROGRAMAS DE ESCUELAS NUEVO-ACUERDO-CTE.pdfisrael garcia
 
institucion educativa la esperanza sede magdalena
institucion educativa la esperanza sede magdalenainstitucion educativa la esperanza sede magdalena
institucion educativa la esperanza sede magdalenajuniorcuellargomez
 
INSTITUCION EDUCATIVA LA ESPERANZA SEDE MAGDALENA
INSTITUCION EDUCATIVA LA ESPERANZA SEDE MAGDALENAINSTITUCION EDUCATIVA LA ESPERANZA SEDE MAGDALENA
INSTITUCION EDUCATIVA LA ESPERANZA SEDE MAGDALENAdanielaerazok
 
Guia para el registro en el sitio slideshare.pdf
Guia para el registro en el sitio slideshare.pdfGuia para el registro en el sitio slideshare.pdf
Guia para el registro en el sitio slideshare.pdflauradbernals
 

Último (10)

COMPETENCIAS CIUDADANASadadadadadadada .pdf
COMPETENCIAS CIUDADANASadadadadadadada .pdfCOMPETENCIAS CIUDADANASadadadadadadada .pdf
COMPETENCIAS CIUDADANASadadadadadadada .pdf
 
Buscadores, SEM SEO: el desafío de ser visto en la web
Buscadores, SEM SEO: el desafío de ser visto en la webBuscadores, SEM SEO: el desafío de ser visto en la web
Buscadores, SEM SEO: el desafío de ser visto en la web
 
COMOGANARAMIGODPARACRISTOIGLESIAADVENTISTANECOCLI,COM
COMOGANARAMIGODPARACRISTOIGLESIAADVENTISTANECOCLI,COMCOMOGANARAMIGODPARACRISTOIGLESIAADVENTISTANECOCLI,COM
COMOGANARAMIGODPARACRISTOIGLESIAADVENTISTANECOCLI,COM
 
libro de Ciencias Sociales_6to grado.pdf
libro de Ciencias Sociales_6to grado.pdflibro de Ciencias Sociales_6to grado.pdf
libro de Ciencias Sociales_6to grado.pdf
 
Institucion educativa la esperanza sede la magdalena
Institucion educativa la esperanza sede la magdalenaInstitucion educativa la esperanza sede la magdalena
Institucion educativa la esperanza sede la magdalena
 
12 Clasificacion de las Computadoras.pdf
12 Clasificacion de las Computadoras.pdf12 Clasificacion de las Computadoras.pdf
12 Clasificacion de las Computadoras.pdf
 
NUVO PROGRAMAS DE ESCUELAS NUEVO-ACUERDO-CTE.pdf
NUVO PROGRAMAS DE ESCUELAS NUEVO-ACUERDO-CTE.pdfNUVO PROGRAMAS DE ESCUELAS NUEVO-ACUERDO-CTE.pdf
NUVO PROGRAMAS DE ESCUELAS NUEVO-ACUERDO-CTE.pdf
 
institucion educativa la esperanza sede magdalena
institucion educativa la esperanza sede magdalenainstitucion educativa la esperanza sede magdalena
institucion educativa la esperanza sede magdalena
 
INSTITUCION EDUCATIVA LA ESPERANZA SEDE MAGDALENA
INSTITUCION EDUCATIVA LA ESPERANZA SEDE MAGDALENAINSTITUCION EDUCATIVA LA ESPERANZA SEDE MAGDALENA
INSTITUCION EDUCATIVA LA ESPERANZA SEDE MAGDALENA
 
Guia para el registro en el sitio slideshare.pdf
Guia para el registro en el sitio slideshare.pdfGuia para el registro en el sitio slideshare.pdf
Guia para el registro en el sitio slideshare.pdf
 

Linq to sql 8

  • 1. LINQ to SQL (Parte 8 – Ejecutar consultas SQL personalizadas) 4 respuestas En las últimas semanas he escrito una serie de post sobre LINQ to SQL. LINQ to SQL es un ORM que viene con .NET 3.5, y nos permite modelar bases de datos relacionales en clases. Podemos usar expresiones LINQ para consultar la base de datos y también para actualizar, insertar y borrar datos. Aquí teneis los enlaces a los diferentes post de la serie:  Parte 1: Introducción a LINQ to SQL  Parte 2: Definiendo el modelo de datos.  Parte 3: Consultando la base de datos  Parte 4: Actualizando la base de datos.  Parte 5: Enlazar controles de interfaz de usuario con el ASP:LinqDatSource  Parte 6: Obtener datos con procedimientos almacenados.  Parte 7: Actualizando la base de datos con procedimientos almacenados. En los dos últimos post vismo cómo podemos usar los procedimientos almacenados de nuestra base de datos para consultar, insertar, actualizar y borrar datos con el modelo de LINQ to SQL. Una pregunta que me han hecho mucho desde que he escrito estos post es: ¿que pasa si quiero control total sobre las consultas SQL que usa LINQ to SQL - pero no quiero usar SPROCs para hacerlo? En el post de hoy veremos eso - y veremos cómo podemos usar expresiones SQL personalizadas para que LINQ to SQL las use en lugar de las que generaría él. Uso de expresiones LINQ con LINQ to SQL. Supongamos que hemos usado el diseñador de LINQ to SQL de VS 2008 para modelar un conjunto de clases a partir de la base de datos Northwind (esto lo vimos en el segundo post de la serie):
  • 2. En el tercer post vimos cómo podemos usar LINQ con las nuevas características de VB y C# para consultar el modelo de clases y devolver un conjunto de objetos que representan las filas y columnas de la base de datos. Por ejemplo, podemos añadir un método a la clase DataContext "GetProductsByCategory" que usa una consulta LINQ para devolver objetos de Products de la base de datos: VB: c#:
  • 3. Una vez definido nuestro método de LINQ, podemos escribir el siguiente código para obtener productos e iterar sobre ellos: VB: Cuando se evalúa la expresión LINQ del método "GetProductsByCategory", el ORM LINQ to SQL ejectuará un SQL dinámico para obtener los datos de la tabla Product para crear los objetos Product. Podeis usar el Visualizador de Debug de LINQ to SQL para ver en el debugger cuál es la expresión LINQ que se ejectuará. Uso de consultas SQL personalizadas con LINQ to SQL En el ejemplo de arriba no tenemos que escribir ningún código SQL para consultar y obtener objetos Product fuertemente tipados. LINQ to SQL traduce la expresión LINQ a SQL por nosotros. ¿Pero que pasa si queremos un control total sobre el SQL que se está ejecutando en nuestra base de datos, y no queremos que LINQ to SQL lo haga por nosotros? Una forma de conseguir esto es usando SPROC como ya vimos en las partes 6 y 7 de esta serie. La otra forma es usar el método auxiliar "ExecuteQuery" de la clase DataContext y usar una expresión SQL personalizada que le demos. Usando el método ExecuteQuery El método ExecuteQuery toma una expresión SQL como argumento , con un conjunto de parámetros, y la ejecuta contra la base de datos (incluyendo JOINs personalizados sobre varias tablas.
  • 4. Lo que hace que ExecuteQuery sea tan útil es que nos permite especifiar cómo queremos devolver los valores de la expresión SQL. Podemos hacer esto pasándole un parámetro tipado al método o usando una versión genérica del método. Por ejemplo, podemos cambiar el método GetProductsByCategory() que creamos ántes -con una expresión LINQ- para que use el método ExecuteQuery para ejectuar un SQL que nosotros le digamos: VB: C#: Ahora podemos llamar al método GetProductsByCategory() de la misma forma que ántes: De esta manera será nuestra consulta SQL la que se ejecutará contra la base de datos - y no el SQL dinámico que generaría la expresión LINQ. SQL personalizado y tracking de objetos para las actualizaciones Por defecto cuando obtenemos objetos con LINQ to SQL, se hace un tracking sobre los cambios que les hacemos. Si llamamos al método "SubmitChanges()" guardará los datos de forma transaccional en la base de datos. Vismo esto en la cuarta parte de esta serie de post. Una de las característcias del metodo ExecuteQuery() es que participa en este tracking de objetos para actualizar el modelo. Por ejemplo, podemos escribir el siguiente código para obtener todos los productos de una categoría y rebajar los precios un 10%:
  • 5. Como dijimos que el tipo de resultado del ExecuteQuery en el método GetProductsByCategory fuese "Product, LINQ to SQL sabe cómo guardar los cambios. Y cuando llamemos a SubmitChanges los guardará. SQL personalizado con clases personalizadas. El método ExecuteQuery nos permite especificar cualquier clase como tipo de resultado de la consulta SQL. La clase no tiene porqué haberse creado con el diseñador LINQ to SQL, o implementar ninguna interfaz. Por ejemplo, definimos la clase ProductSummary con un subconjunto de las propiedades de Product (fijáos que hemos usado la característica de propiedades automáticas): Podríamos crear otro método en nuestro DataContext llamado GetProductSummariesByCategory() que nos devuelva objetos de esa clase. Fijáos cómo la siguiente SQL obtiene sólo un subconjunto de Product - El método ExecuteQuery() se encarga de mapea automáticamente las propiedades a objetos de la clase ProductSumary: Ahora podemos invocar a este método e iterar sobre los resultados con el siguiente codigo: SQL personalizadas para inserciones, actualizaciones y borrados. Además de usar SQL personalizadas para consultar datos, también podemos hacerlas para insertar, actualizar y borrar datos.
  • 6. Esto lo conseguimos creando los métodos parciales adecuados para cada operacion para la entidad que queramos cambiar en nuestra clase DataContext. Podemos usar el método ExecuteCommand del DataContext para escribir el SQL que queramos. Por ejemplo, para sobreescribir el comportamiento de borrado de la clase Product definimos el siguiente método parcial: Y si escribimos un código que elimine un producto de la base de datos, LINQ to SQL llamará al método DeleteProduct - que ejecutará una SQL personalizada en lugar del SQL dinámico que LINQ to SQL usaría: Resumen El ORM LINQ to SQL genera y ejectua un SQL dinámico para las consultas, actualizaciones, inserciones y borrados contra la base de datos. Para escenarios más avanzados, o en caso donde queramos un control total sobre el SQL que se ejecuta, también podemos personalizar el ORM para que ejecute SPROCs, o nuestras consultas SQL personalizadas. Esto nos da una gran flexibilidad a la hora de construir y extender nuestra capa de datos. En próximos post veremos algunos conceptos de LINQ to SQL como: Herenacia simple de talbas, carga a petición, concurrencia optimista, y escenarios de N-capas.