LINQ to SQL
La creación de clases LINQ to SQL
LINQ to SQL es un sistema que permite tener clases fuertemente tipadas para el acceso a los datos almacenados en SQL Server. LINQ utiliza las relaciones entre las tablas de la base de datos para cargar datos en los objetos, listos para ser utilizados por el código. LINQ to SQL no es solo útil para la extracción de datos, también permite realizar inserciones, actualizaciones y eliminación de datos.
Visual Studio facilita la creación de clases LINQ to SQL mediante un diseñador de objetos relacionales que permite crear visualmente objetos y definir sus relaciones. Para beneficiarse de los modelos utilizados en este capítulo, debe instalar Herramientas LINQ to SQL desde el instalador de Visual Studio, en la pestaña Componentes individuales en la sección Herramientas de código.
Cree una carpeta nueva llamada LinqToSql en el proyecto Database y agregue un nuevo elemento Clases de LINQ to SQL llamado SelfMailer.dbml.
Visual Studio agrega el archivo al proyecto y lo abre en el diseñador de objetos relacionales.
También se incluye la referencia a la librería System.Data.Linq.
Abra el Explorador de servidores y arrastre las tres tablas (MailServers, MailServerSender y Senders) de la base de datos SelfMailer hacia el diseñador de objetos relacionales:
Visual Studio analiza las tablas, sus relaciones y sus columnas para crear las clases...
El objeto DataContext
La clase SelfMailerDataContext se encarga de gestionar las conexiones con la base de datos para la ejecución de las consultas. Deriva de la clase DataContext. Antes de poder ejecutar consultas en una base de datos, se debe instanciar un nuevo objeto DataContext del tipo deseado. Esta instanciación se puede hacer sin argumentos. La cadena de conexión que se utiliza será la especificada en las propiedades de la clase LINQ to SQL:
La instanciación del objeto DataContext se hace preferentemente dentro de una cláusula using, de manera que los recursos del objeto se liberen:
// Uso de la cláusula using
using (SelfMailerDataContext context = new
SelfMailerDataContext())
{
...
}
// Sin cláusula using, el objeto se debe liberar explícitamente
SelfMailerDataContext context = new SelfMailerDataContext();
...
context.Dispose();
1. El método ExecuteQuery
La manera más rápida de ejecutar una consulta es usar el método ExecuteQuery<T> del objeto DataContext. La instrucción que permite recuperar todos los registros de una tabla es la siguiente:
IEnumerable<MailServers> query1 = context
.ExecuteQuery<MailServers>(
...
Ejecutar las consultas con LINQ
Las consultas LINQ permiten tener una sintaxis tipada. Esta sintaxis se evalúa en tiempo de compilación de la aplicación, a diferencia de las consultas en forma de cadena de caracteres, realizadas con el método ExecuteQuery<T> del objeto DataContext, que solo generarán un error durante la ejecución y transmisión de la consulta la base de datos.
Las consultas LINQ to SQL siguen los mismos principios de la sintaxis LINQ general.
1. Las consultas sencillas
Las consultas sencillas se realizan mediante una cláusula from y una cláusula select:
var query = from ms in context.MailServers
select ms;
En este ejemplo, se asigna al objeto query la colección de registros de la tabla MailServers.
2. Las consultas filtradas
La cláusula where permite filtrar los datos que serán devueltos:
var query = from ms in context.MailServers
where ms.Password_AllowSave == true
select ms;
En este ejemplo, se asigna al objeto query la colección de registros de la tabla MailServers con valor true en la columna Password_AllowSave.
3. Los joins
El join entre varias tablas se realiza mediante la cláusula join:
var query = from ms in context.MailServers
join...
Los procedimientos almacenados
Agregue el siguiente procedimiento almacenado a la base de datos:
CREATE PROCEDURE dbo.GetLinkedMailServersSenders
(@MailServerID int = 0)
AS
SELECT ms.*, s.*
FROM MailServers AS ms
INNER JOIN MailServerSender AS mss
ON ms.ID = mss.MailServer_ID
INNER JOIN Senders AS s
ON mss.Sender_ID = s.ID
WHERE ms.ID = @MailServerID
Este procedimiento almacenado permite recuperar los registros de las tablas MailServers y Senders que están relacionadas en función del identificador de un registro.
1. La adición de procedimientos almacenados al modelo
Para añadir un procedimiento almacenado al modelo de datos basta con seleccionarlo y, a continuación, arrastrarlo desde el Explorador de servidores hacia el diseñador de objetos relacionales:
Visual Studio añade un método con el nombre del procedimiento almacenado al objeto que deriva de DataContext. Los argumentos del método también se declaran en función de los argumentos del procedimiento almacenado:
[global::System.Data.Linq.Mapping.FunctionAttribute
(Name="dbo.GetLinkedMailServersSenders")]
public ISingleResult<GetLinkedMailServersSendersResult>...