Está en la página 1de 15

Tutorial LINQ to SQLite

Este tutorial lo gua a travs del proceso de creacin de una aplicacin simple
con tecnologa LinqConnect . En menos de 5 minutos tendr una capa de acceso a datos
lista para usar para sus objetos comerciales.
En este tutorial:

Presentacin de la tecnologa LinqConnect (LINQ to SQLite)

Requisitos

Preparando el Proyecto

Generacin de modelo desde la base de datos

Consulta de datos

Insertar nuevos datos

Actualizacin de datos

Eliminando datos

Informacin Adicional

Presentacin de la tecnologa LinqConnect (LINQ


to SQLite)
LinqConnect (anteriormente conocido como LINQ to SQLite) es la solucin ORM rpida y
ligera, que es muy compatible con Microsoft LINQ to SQL y contiene sus propias
caractersticas avanzadas, como compatibilidad de tipo complejo, opciones avanzadas de
obtencin de datos, cach de consulta compilable configurable y otros.
LINQ significa "Consulta integrada de idiomas", lo que significa que la recuperacin de datos
ya no es un idioma independiente. El motor LINQ permite que las aplicaciones .NET se
conecten a las bases de datos sin preocuparse mucho por las columnas y las filas. Los
datos que recibe se forman automticamente como objetos listos para usar por su lgica
empresarial.
El LINQ a los datos relacionales puede considerarse una herramienta de asignacin de
objetos relacional (ORM). Las consultas LINQ tipo seguro se compilan en MSIL sobre la
marcha, y las clusulas de consulta se traducen a SQL y se envan a la base de datos
SQLite para su ejecucin. Esto hace que su capa de acceso a datos sea ms segura, ms
rpida y mucho ms conveniente para el diseo.

Requisitos
En este tutorial se supone que ya tiene los objetos de la base de datos
creados. Debe ejecutar un script del siguiente archivo instalado de forma predeterminada
en
\ Archivos de programa \ Devart \ dotConnect \ SQLite \ Samples \ crm_demo.sql.

Preparando el Proyecto
Cree una nueva aplicacin de consola en Visual Studio. Podra ser cualquier otro tipo de
proyecto, pero, por motivos de simplicidad, utilizaremos el proyecto de consola a lo largo
del tutorial. El resto del tutorial asume que el nombre del proyecto
es ConsoleApplication1 . Si su proyecto se nombra de otro modo, tendr que sustituir este
nombre por uno real en el Explorador de soluciones.

Generacin de modelo desde la base de datos


1. Agregue el modelo Devart LinqConnect al proyecto. Para ello, haga clic derecho
en el nodo del proyecto en el Explorador de soluciones, seleccione Agregar , haga
clic en Nuevo elemento ... . En el cuadro de dilogo Agregar nuevo
elemento, seleccione la categora Datos , elija la plantilla del modelo Devart
LinqConnect y haga clic en Agregar . Esto automticamente inicia el asistente
Crear nuevo modelo, que crea un nuevo modelo vaco o lo genera desde la base
de datos.

2. Haga clic en Siguiente en la pantalla de bienvenida.


3. Rellene la configuracin de conexin y haga clic en Siguiente .

4. Elija objetos de base de datos que se usarn en el modelo. Estos son todos los
objetos del script crm_demo, incluidas las tablas auxiliares. Haga clic
en Siguiente .

5. En la siguiente pantalla, puede ajustar las reglas de nomenclatura para las


entidades y sus miembros. Para la base de datos Demo de CRM no se requieren
reglas, as que simplemente haga clic en Siguiente .

6. Ingrese CrmDemoContext como espacio de nombres


y CrmDemoDataContext como el nombre de descendiente de DataContext. Este
ser el nombre de la clase principal de acceso a datos. Haga clic en Siguiente .

7. Presione Finalizar . El modelo se generar y abrir en Entity Developer.


8. En el men principal, haga clic en Archivo | Guardar . Esto actualiza el cdigo de
modelo CrmDemoDataContext generado en Visual Studio.

El modelo que acaba de generar est listo para usar.


Entity Developer crea clases para todas las tablas seleccionadas que representan
entidades. Tambin crea un descendiente de la clase Devart.Data.Linq.DataContext , que
controla la conexin a la base de datos y el flujo de datos completo. Esta clase incluye
propiedades y mtodos nombrados despus de los objetos de su base de datos. Usar
estos miembros para recuperar y modificar datos en el contexto. El cdigo generado se
encuentra en el archivo DataContext1.Designer.cs (DataContext1.Designer.vb). Puede
escribir sus propias clases parciales y mtodos para ello en el archivo DataContext1.cs
(DataContext1.vb).

Consulta de datos
Todas las operaciones de LINQ a SQLite se ejecutan a travs del descendiente de
DataContext, que se denomina CrmDemoDataContext en este tutorial. Para recuperar
datos, primero debe crear una instancia del contexto, luego preparar una consulta
con LinqConnect y luego acceder al objeto devuelto por la consulta, que puede ser una
coleccin de objetos o un solo objeto.
Vamos a leer todos los datos de la tabla de la empresa, ordenarlos por CompanyID y
mostrar algunas columnas. Agregue el siguiente bloque de cdigo al mtodo Main:

C#
CrmDemoDataContext context = new CrmDemoDataContext();
var query = from it in context.Companies
orderby it.CompanyID
select it;

foreach (Company comp in query)


Console.WriteLine("{0} | {1} | {2}", comp.CompanyID, comp.CompanyName, comp.Co
untry);

Console.ReadLine();

Visual Basic
Dim context As CrmDemoDataContext = New CrmDemoDataContext
Dim query = From it In context.companies _
Order By it.CompanyID _
Select it

Dim comp As company


For Each comp In query
Console.WriteLine("{0} | {1} | {2}", comp.CompanyID, comp.CompanyName, comp.
Country)
Next

Console.ReadLine()
sencillo como eso. Prepara una consulta y luego itera a travs de ella como lo hara con
una coleccin de objetos habitual. La interaccin de la base de datos es realizada por
LinqConnect en segundo plano. Ahora veamos quin es quin en este ejemplo de cdigo.

CrmDemoDataContext es el nombre de la clase que sabe todo sobre su modelo y

hace todo lo posible para recuperar y modificar datos relacionados en la base de

datos. Todas las operaciones de LinqConnect se realizan dentro de las

propiedades y mtodos de esta clase. Esta clase est diseada para ser ligera y

no costosa de crear, por lo que se recomienda crear una nueva instancia de

DataContext para cualquier 'unidad de trabajo' y disponerla despus de que se

complete esta unidad.

consulta , que son nombres de variables arbitrarias en la declaracin de LINQ a

SQL. El primero se usa como la coleccin de objetos de datos, este ltimo se

utiliza para hacer referencia a entidades individuales en una coleccin y solo se

encuentra dentro de la declaracin.

context.Companies se refiere a una propiedad pblica de la clase

CrmDemoDataContext. Esta propiedad representa la coleccin de todas las

empresas en el contexto.

Company (en la declaracin foreach ) es el nombre de una clase generada

automticamente. Esta clase se asigna a la tabla de la compaa en la base de

datos y se nombra despus de ella.

Aqu est el resultado del proyecto en la consola:


Tenga en cuenta que el cdigo de consulta de LINQ simplemente describe la consulta. No
lo ejecuta. Este enfoque se conoce como ejecucin diferida.
Ahora vamos a consultar datos de dos tablas unidas con una clave externa. Reemplace el
cdigo antiguo con esto:

C#
CrmDemoDataContext context = new CrmDemoDataContext();
var query = from it in context.Companies
orderby it.CompanyID
select it;

foreach (Company comp in query) {


if (comp.PersonContacts.Count > 0) {
Console.WriteLine("{0} | {1} | {2}",
comp.CompanyName, comp.PersonContacts[0].FirstName,
comp.PersonContacts[0].LastName);
}
}

Console.ReadLine();
Visual Basic
Dim context As CrmDemoDataContext = New CrmDemoDataContext
Dim query = From it In context.companies _
Order By it.CompanyID _
Select it

Dim comp As company


For Each comp In query
If comp.personcontacts.Count > 0 Then
Console.WriteLine("{0} | {1} | {2}", _
comp.CompanyName, comp.personcontacts(0).FirstName, _
comp.personcontacts(0).LastName)
End If
Next

Console.ReadLine()

Como puede ver, la declaracin de consulta de LINQ no se modific en absoluto. Los datos
sobre las personas de contacto se recuperaron de la base de datos automticamente
cuando accedi a la propiedad correspondiente del objeto de la empresa. Esta es una de
las mejores cosas de LINQ: no tiene que preocuparse por las dependencias cuando escribe
consultas.

Insertar nuevos datos


Lo que antes era agregar filas a las tablas, ahora solo agrega nuevos objetos a las
colecciones de contexto. Cuando est listo para enviar los cambios a la base de datos,
llame al mtodo SubmitChanges () del contexto. Antes de hacer esto, primero debe
establecer todas las propiedades que no admiten valores nulos ( Nada ). El mtodo
SubmitChanges () genera y ejecuta comandos que realizan las instrucciones INSERT,
UPDATE o DELETE equivalentes contra el origen de datos.
Agreguemos un nuevo producto y una nueva categora a la base de datos. Reemplace el
cdigo antiguo con esto:
C#
CrmDemoDataContext context = new CrmDemoDataContext();

// Create a new category


ProductCategory newCategory = new ProductCategory();
newCategory.CategoryID = 1000;
newCategory.CategoryName = "New category";

// Create a new product


Product newProduct = new Product();
newProduct.ProductID = 2000;
newProduct.ProductName = "New product";
newProduct.Price = 20;

// Associate the new product with the new category


newProduct.ProductCategory = newCategory;
context.Products.InsertOnSubmit(newProduct);

// Send the changes to the database.


// Until you do it, the changes are cached on the client side.
context.SubmitChanges();

// Request the new product from the database


var query = from it in context.Products
where it.ProductID == 2000
select it;

// Since we query for a single object instead of a collection, we can use the me
thod First()
Product product = query.First();
Console.WriteLine("{0} | {1} | {2}",
product.ProductCategory.CategoryName, product.ProductName, product.Price);
Console.ReadLine();

Visual Basic
Dim context As CrmDemoDataContext = New CrmDemoDataContext
' Create a new category
Dim newCategory As productcategory = New productcategory()
newCategory.CategoryID = 1000
newCategory.CategoryName = "New category"

' Create a new product


Dim newProduct As product = New product()
newProduct.ProductID = 2000
newProduct.ProductName = "New product"
newProduct.Price = 20
' Associate the new product with the new category
newProduct.productcategory = newCategory
context.products.InsertOnSubmit(newProduct)

' Send the changes to the database.


' Until you do it, the changes are cached on the client side.
context.SubmitChanges()

' Request the new product from the database


Dim query = From it In context.products _
Where it.ProductID = 2000 _
Select it

' Since we query for a single object instead of a collection, we can use the met
hod First()
Dim product As product = query.First()
Console.WriteLine("{0} | {1} | {2}", _
product.productcategory.CategoryName, product.ProductName, product.Price)
Console.ReadLine()
El mtodo InsertOnSubmit () se crea para cada coleccin en el contexto. Este mtodo
almacena en la informacin de la base de datos todos los objetos vinculados. Como se
muestra en el ejemplo, solo es necesario llamar a InsertOnSubmit () una vez para enviar
los objetos del producto y de la categora.
Tenga en cuenta que despus de agregar el nuevo producto y la categora al enviar los
cambios, no puede ejecutar esta solucin nuevamente como es. Para ejecutar la solucin
nuevamente, cambie las identificaciones de los objetos que se agregarn.

Actualizacin de datos
Las instancias de entidad se modifican como de costumbre. Lo nico que hay que recordar
es que debe invocar el mtodo SubmitChanges () para enviar los datos a la base de datos.
Aada el siguiente bloque al cdigo existente e inicie el proyecto:
C#
product.ProductName = "Edited product";
product.Price = 15;
context.SubmitChanges();

Visual Basic
product.ProductName = "Edited product"
product.Price = 15
context.SubmitChanges()

Eliminando datos
Para extraer una instancia de un contexto, use el mtodo DeleteOnSubmit de la coleccin
correspondiente. El objeto se elimina de la coleccin de este tipo, pero no se destruye. Para
eliminar los datos del objeto de la base de datos invoque el mtodo SubmitChanges ().
Puede hacer esto con un bloque de cdigo como el siguiente:

C#
context.products.DeleteOnSubmit(newProduct);
context.productcategories.DeleteOnSubmit(newCategory);
context.SubmitChanges();

Visual Basic
context.products.DeleteOnSubmit(newProduct)
context.productcategories.DeleteOnSubmit(newCategory)
context.SubmitChanges()

La supresin de objetos se ve afectada por los atributos del modelo. Cuando


el parmetro DeleteRule es Cascade , los objetos dependientes se eliminan
automticamente. Cuando este parmetro es SetNull , los objetos dependientes no se
eliminan, pero la relacin se anula. Cuando no se especifica ninguna regla, el orden de la
secuencia de eliminacin es importante.

Informacin Adicional
Ahora que puede realizar la manipulacin bsica de datos con LinqConnect , puede pasar
a algunos temas avanzados. dotConnect para SQLite incluye una seccin de ayuda
dedicada a la tecnologa LinqConnect. Puede acceder a l en lnea
en https://www.devart.com/linqconnect/docs/ .
LinqConnect se desarrolla estrechamente con la implementacin de LINQ to SQL por parte
de Microsoft, por lo que puede encontrar informacin til en MSDN:

LINQ to SQL

LINQ to SQL: Consulta integrada de lenguaje .NET para datos relacionales

Para la experiencia prctica, utilice muestras enviadas con dotConnect para SQLite. Puede
acceder a las muestras desde el men Inicio.
Para comprender mejor los trabajos del motor LinqConnect, puede ver las sentencias SQL
generadas en dbMonitor o usar la propiedad DataContext.Log.

También podría gustarte