Como bien sabemos LINQ es un conjunto de tecnologías grandioso, contiene cualquier cantidad de herramientas que para nosotros los desarrolladores esta al alcance de la mano y que para nuestros proyectos pueden ser de gran ayuda en el momento de ejecutarlos, compilarlos, hacerles tipado, entre otras funciones. Conocimos a LINQ con el propósito de hacer consultas de manera general para cualquier fuente de origen de datos, entre ellas bases de datos SQL, ficheros XML, servicios web, colecciones fuertemente tipadas, etc., es por ello que, para este apartado, vamos a tratar especialmente con las bases de datos SQL; para esto usaremos la tecnología LINQ to SQL.
LINQ to SQL es una implementación de O/RM (mapeo relacional de objetos), que usamos para gestionar datos relacionales como objetos al momento de ejecutar nuestra aplicación, mediante esto buscamos que las consultas que realizamos en el lenguaje del modelo de objetos sean traducidas a SQL, pero ¿de qué modo?; para realizar esto se siguen dos pasos, primero se envían las consultas a la base de datos para su ejecución, acá esperamos los resultados de la base de datos y como segundo paso LINQ to SQL las traduce nuevamente en objetos.
Bueno, ya sabemos que es LINQ to SQL, pero de que manera vemos esta tecnología integrada en LINQ. Esta integración se da en el momento que queremos consultar datos en las bases de datos de SQL, ya que para este proceso recurrimos al uso de las expresiones de LINQ; entre estas expresiones y funciones encontramos las básicas como insertar, eliminar y actualizar datos. Además, a esto LINQ to SQL es compatible con vistas, transacciones y procedimientos almacenados e inclusive con esta tecnología podremos integrar reglas de validación de datos y lógica de negocios para nuestro modelo de datos.
Sin más preámbulo veamos cómo funciona esta grandiosa herramienta.
Para comenzar con la parte practica de LINQ to SQL vamos a seguir los siguientes pasos:
1. Creamos un proyecto en Visual Studio.
2. Agregamos una nueva conexión a la base de datos utilizando el Explorador de servidores. Para esto daremos clic derecho en Conexiones de datos y en el menú que se despliega haremos clic en Agregar conexión.
3. Luego de dar clic en Agregar conexión aparecerá la siguiente ventana, acá debemos ingresar el nombre de nuestro servidor y paso seguido seleccionamos la base de datos con la que deseamos trabajar, para finalizar probamos la conexión y hacemos clic en Aceptar.
4. Como paso a seguir, debemos agregar Clases de LINQ to SQL como nuevo elemento a nuestra aplicación, para eso debemos ir al Explorador de soluciones, allí, damos clic derecho a nuestra aplicación y luego desplegar el menú de Agregar, escogemos Nuevo elemento.
5. Luego de dar clic en Nuevo elemento vamos a la opción datos y agregamos la opción Clases de LINQ to SQL.
6. Seleccionamos las tablas que contenga nuestra base de datos. Para esto lo único que debemos hacer es ir al Explorador de servidores y seleccionar la conexión agregada anteriormente, luego vamos a arrastrar la tabla a la ventana que se genera por el paso anterior.
7. Luego de crear las Clases de LINQ to SQL y agregar las tablas se crea un DataContext DataClasses1DataContext. DataClasses1DataContext, mediante este podremos conectarnos a la fuente de datos y así poder ejecutar satisfactoriamente nuestras consultas de LINQ a SQL.
Teniendo estos pasos realizados comencemos a interactuar con LINQ to SQL, para esto vamos a hacer cuatro procesos básicos, consultar, insertar, actualizar y por último eliminar. Luego de observar estos procedimientos seguiremos a observar operaciones un poco mas complejas, de forma que varias de las tablas con las que cuenta mi base de datos puedan interactuar.
Antes de empezar con lo practico es bueno saber la forma como LINQ ensambla las consultas. Las operaciones de consulta en LINQ se ensamblan mediante tres acciones: captando el origen u origen de datos, creando la consulta y por último ejecutando la consulta, esta consulta se almacenará en una variable, donde esta variable no ejecutara ninguna acción o devolución de datos, solo guardará la información de la consulta. Luego de crear la consulta esta variable se ejecutará para recuperar los datos.
Cuando realizamos consultas en LINQ to SQL pueden aparecer ciertos inconvenientes o problemas, no todo puede ser perfecto, algunos de estos son:
■ Un problema que por lo general surge al ensamblar consultas con esta herramienta es que no podemos realizar todas las consultas que deseamos, esto es porque existen operadores de consulta estándar que no tienen conversión de LINQ a SQL por la diferencia existente entre los conjuntos múltiples no ordenados y las secuencias, entre estos se encuentran ElementAt, Last, Reverse, entre otros. Es por esta razón que debemos usar operadores que puedan tener la conversión de LINQ a SQL, por ejemplo, el operador Concat tiene conversión a SQL usando UNION ALL.
■ Otro problema cuando realizamos consultas es que Visual Studio nos arroje este error «No se puede consultar una expresión de tipo [expresión]. La solución a esto puede estar en agregar las referencias Core.dll y System.Data.Linq.dll, y los using System.Linq y System.Data.Linq.
■ A demás de los anteriores inconvenientes, se puede generar “GroupBy InvalidOperationException”, esta excepción se genera cuando asignamos un valor nulo a una columna en una consulta GroupBy que agrupa mediante una expresión boolena, como group x by (Student==@student), al realizar la comparación se produce un valor nulo, pero el programa intentara asignar nullable«boolean a un boolean, en este intento se generara la excepción. Para solucionar este inconveniente la expresión correcta para este caso debe plantearse así: GroupBy=»(Student! = null) && (Student=@Student)», esto en el caso de que los valores null deban ser falsos.
Consultar
Lo primero que vamos a realizar es la consulta, en este proceso vamos a consultar los estudiantes que estudian la carrera de “Mecatrónica”, lo voy a mostrar usando la sintaxis de consulta y la sintaxis de método, es decir, usando la expresión lambda.
Sintaxis de Consulta
Sintaxis de Método
Insertar
Originalmente mi base de datos cuenta con 7 alumnos, pero al ejecutar mi InsertAlumno agregare un objeto al modelo de objetos que he creado llamando de paso a SubmitChanges en el DataContext.
Compilo y ejecuto mi código hecho en C# mediante el uso de LINQ.
Y luego de esto podemos observar que el objeto que agregue mediante LINQ ya se encuentra en la base de datos de SQL.
Aparte a la vista anterior, quise que el proceso de ejecución de esta consulta se hiciera a través de SQL Server Profiler. Esto con el propósito de observar que sucede internamente con el motor de bases de datos al momento de compilar y ejecutar mi consulta mediante LINQ to SQL
Actualizar
Para hacer una actualización usando LINQ to SQL primero debemos recuperar el o los elementos a modificar y luego editarlos en el modelo de objetos, al igual que con InsertAlumno, se hace el llamado de SubmitChanges en el DataContext. Para este ejemplo voy a usar la tabla Materia que se encuentra en mi misma base de datos, lo que hare, será modificar la materia de Oleoneumatica, sumado a eso se cambiará tanto la Id de la materia como la cantidad de créditos.
Compilo y ejecuto mi código hecho en C# mediante el uso de LINQ.
Al compilar podemos observar que el objeto que actualice mediante LINQ ya se encuentra actualizado en la base de datos de SQL.
Proceso en SQL Server Profiler
Eliminar
Ahora vamos a eliminar el elemento de la base de datos, luego de este proceso hacemos el llamado de SubmitChanges en el DataContext para confirmar el cambio. Para este proceso usare la tabla Profesor, el proceso de eliminación se hará al Profesor Edwin Álvarez.
Compilo y ejecuto mi código hecho en C# mediante el uso de LINQ.
Así mismo luego de compilar podemos observar los cambios en la base de datos de SQL, para este punto se eliminó el profesor “Edwin” junto con todos sus datos.
Proceso SQL Server Profiler
Para terminar, haremos otras consultas mediante LINQ to SQL con operadores como los siguientes
Join: Acá buscaremos unir datos tanto de la tabla alumno como de la tabla carrera.
En respuesta a esta consulta se obtiene la siguiente tabla:
Proceso SQL Server Profiler
GroupBy: este operador lo utilizare para agrupar los estudiantes de acuerdo con la edad que tienen.
Respuesta:
Proceso SQL Server Profiler
Any: Con este operador buscamos saber si un elemento existe o no, en este caso, si camilo no existe agréguelo.
Respuesta: Camilo es agregado a los alumnos, pero sus datos son NULL ya que se realizo por medio de un operador y no como método para insertar.
Proceso SQL Server Profiler
Leonardo Pirajan
Consultor Técnico Junior
Attomo Group