LinqToSQL proporciona una infraestructura para la gestión de datos relacionales como objetos sin perder la capacidad de consulta a la base de datos. Este es independiente del idioma, es decir cualquier lenguaje (VB o C#) construido para proporcionar LINQ se puede utilizar para permitir el acceso a la información almacenada en bases de datos relacionales. Todo esto quiere decir que podemos arrastrar literalmente todas nuestras tablas, vistas y procedimientos de nuestra base de datos SQL y manipularlas como entidades, las cuales conservan las relaciones de la base de datos mediante la POO de manera automática.
En Visual Studio, damos Click en Archivo, Nuevo, Sitio Web. Seleccionamos el .NET Framework, el lenguaje de Programación VB o C# (En mis ejemplos siempre será C#), Sitio Web ASP.NET vacío y seleccionamos la ubicación.
Esto creará una solución y un proyecto (Capa de Presentación). Agregaremos nuestra capa de Datos mediante el Explorador de la solución, Click derecho sobre la solución, Añadir, Nuevo Proyecto.
Posteriormente seleccionamos el lenguaje (Podemos observar que cada proyecto (capa en nuestro ejemplo) puede tener un lenguaje de programación distinto, esto se debe gracias a que al compilar nuestra solución cada proyecto se compila a CIL), el .NET Framework de nuestra capa de Acceso a datos, Biblioteca de clases.
Recuerda cambiar la ubicación a la carpeta de nuestra solución.
Borramos la clase que se crea por defecto, ya que en nuestro ejemplo no es de utilidad
Click derecho sobre nuestro proyecto (Capa de acceso a datos), Agregar, Nuevo Item.
Ahora agregaremos LINQ to SQL Classes, que será el encargado de crear las clases de entidad que estarán mapeadas a nuestras tablas y vistas.
Ahora nos conectamos a nuestra base de datos mediante el explorador de Servidores
Seleccionamos las tablas, vistas y procedimientos almacenados que vayamos a emplear de nuestra base de datos y con el Click sostenido las arrastramos al diseñador
Aceptamos y automáticamente aparecerán las clases de entidad en nuestra vista de diseñador, incluyendo las relaciones existentes. En el espacio de la derecha, si hubiéramos arrastrado, se verían los procedimientos almacenados.
Guardamos y ya tenemos nuestra Capa de Acceso a datos lista. En el archivo app.config que se crea automáticamente además del DataContext (Punto de entrada sobre la cual haremos CRUD a nuestra base de datos), podemos visualizar la cadena de conexión. Ahora agregaremos un nuevo proyecto para nuestra Capa de Negocio, agregando nuevamente una biblioteca de clases como anteriormente hicimos para la capa de Acceso a Datos.
Cabe aclarar que una capa inferior no puede tener una versión de .NET Framework superior, es decir la capa de Acceso a datos por ejemplo no puede tener una versión superior de .NET Framework que la versión de la Capa de Negocio, pero la Capa de Negocio si puede tener una versión superior a la de Acceso a Datos.
Agregamos la referencia de la Capa de Acceso a Datos en nuestra Capa de Negocio
Ahora le cambiaremos el nombre a nuestra Clase creada por defecto, en mi caso la llamare “Manager”, agregamos la referencia de nuestra Capa de Acceso a Datos (using Data;) y creamos una instancia de nuestro DataContext sobre el cual haremos CRUD a nuestra Base de Datos.
Manager.cs
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- using Data;
-
- namespace Core
- {
- public class Manager
- {
- #region Data
- private DataClassesDataContext model;
- private DataClassesDataContext DataModel
- {
- get
- {
- return model ?? (model = new DataClassesDataContext());
- }
- set
- {
- model = value;
- }
- }
- #endregion
- }
- }
Ahora hare unos ejemplos de CRUD con LINQ, en mi caso me encanta emplear Expresiones Lambda para las consultas, por lo tanto agrego la referencia System.Data.Linq a la Capa de Negocio
Seleccionando Registros
- #region Select
-
- public IQueryable<User> GetUsers()
- {
- return DataModel.Users;
- }
-
- public IQueryable<User> GetUsersByName(string name)
- {
- name = name.ToLower();
- return DataModel.Users.Where(x=>x.FirstName.ToLower().Contains(name)
- || x.LastName.ToLower().Contains(name));
- }
-
- public User GetUser(Guid userId)
- {
- return DataModel.Users.SingleOrDefault(x => x.UserId == userId);
- }
-
- #endregion
Donde en el primer caso hacemos una consulta de todos los usuarios de nuestra Base de Datos. Como la tabla se llama Users podemos identificar que User es en si solo un registro de esa tabla.
En el segundo caso consultamos todos los usuarios que tengan en sus nombres o apellidos el valor de la variable name, sin importar si esta en mayúsculas o minúsculas, es el primer ejemplo de expresiones lambda y podemos ver lo sencillo que es.
En el tercer caso consultamos únicamente el usuario con ese userId, la diferencia entre Single y SingleOrDefault es que este ultimo retorna null si el usuario con ese id no existe en la base de datos.
Actualizando Registros
- #region Update
-
- public void UpdateUserName(Guid userId, string newfirstname)
- {
- User user = GetUser(userId);
- user.FirstName = newfirstname;
- DataModel.SubmitChanges();
- }
-
- public void UpdateUsersName(string newfirstname)
- {
- var users = GetUsers();
- foreach (var user in users)
- {
- user.FirstName = newfirstname;
- }
- DataModel.SubmitChanges();
- }
-
- #endregion
En los 2 casos consultamos primero a la Base de datos, luego al registro le asignamos el nuevo valor y por último confirmamos los cambios al DataContext.
Insertando un Registro
- #region Insert
-
- public void InsetUser(string firstname, string lastname)
- {
- DataModel.Users.InsertOnSubmit(new User()
- {
- FirstName = firstname,
- LastName = lastname
- });
- DataModel.SubmitChanges();
- }
-
- #endregion
Debes de crear un nuevo registro que cumpla con los campos requeridos en la Base de Datos, recuerda que si la columna del Id es identity, no le debes de dar ningún valor porque se asigna solo.
Eliminando un Registro
- #region Delete
-
- public void DeleteUser(Guid userId)
- {
- DataModel.Users.DeleteOnSubmit(GetUser(userId));
- DataModel.SubmitChanges();
- }
-
- #endregion
Ahora procedemos a agregar la referencia de nuestra Capa de Negocio a nuestra capa de Presentación, en este caso el Sitio Web.
Y por lo tanto, ya podemos llamar nuestra lógica de negocio en nuestra Capa de Presentación.
Agregamos un nuevo WebForm
Agregamos la referencia de nuestra Capa de Negocio, otra forma de hacerlo es copiar el nombre de la Clase y presionar Ctrl + . con esto nos aparecerá la posible referencia a agregar de la Clase.
Y llamamos nuestra lógica de negocio
- using Core;
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Web;
- using System.Web.UI;
- using System.Web.UI.WebControls;
-
- public partial class _Default : System.Web.UI.Page
- {
- protected void Page_Load(object sender, EventArgs e)
- {
- Manager manager = new Manager();
- manager.InsetUser("Juan David", "Nicholls");
- }
- }
Y así hemos terminado con éxito el ejercicio, hasta la próxima ;)