Está en la página 1de 31

LINQ y el acceso a datos

con Visual Basic 2008


Guillermo 'guille' Som
mensaje@elguille.info
Agenda

• Un vistazo a LINQ
• Acceso a datos con LINQ
Un vistazo a LINQ

• Las variantes de LINQ


• LINQ to Objects
• LINQ to XML
• LINQ to ADO.NET
o LINQ to DataSet
o LINQ to SQL
Un vistazo a LINQ
Visual Basic C# Otros…

.NET Language-Integrated Query

Fuentes de datos LINQ

LINQ to ADO.NET
LINQ LINQ
LINQ LINQ LINQ
To To
To To To
Objects XML
Datasets SQL Entities

<book>
<title/>
<author/>
<price/>
</book>

Objetos Relacional XML


Un vistazo a LINQ

LINQ to Objects
• Permite acceder a datos en memoria usando la
tecnología de LINQ
• La condición es que esos datos expongan
IEnumerable o IEnumerable(Of T)
• Los arrays, colecciones, etc. cumplen esta condición
DEMO
LINQ to Objects
Un vistazo a LINQ

LINQ to XML
• Permite acceder a datos XML usando la
tecnología de LINQ
• En VB9 se mejora de forma que se pueden usar
literales de XML directamente en el código
Un vistazo a LINQ

LINQ to ADO.NET
• Permite acceder a datos de ADO.NET usando la
tecnología de LINQ
• Se incluyen otras dos tecnologías:
• LINQ to DataSet
• LINQ to SQL
• Este será básicamente el tema de esta charla
Agenda

• Un vistazo a LINQ
• Acceso a datos con LINQ
Acceso a datos con LINQ y VB9

LINQ to DataSet
• Permite usar ADO.NET 2.0 con LINQ
Acceso a datos con LINQ y VB9

LINQ to DataSet
• Simplificando mucho:
• Llenamos el DataSet y después usamos LINQ
para usar esos datos en memoria
Acceso a datos con LINQ y VB9

LINQ to DataSet
• Cuando tengamos los datos en el DataSet,
usaremos LINQ para trabajar con ellos

Dim ta As New NorthwindDataSetTableAdapters. _


CustomersTableAdapter
Dim ds As New NorthwindDataSet
ta.Fill(ds.Customers)

Dim clientes = From cli In ds.Customers _


Where cli.Country.StartsWith("U") _
Order By cli.ContactName _
Select cli

For Each c In clientes


Console.WriteLine("{0}, {1}", c.ContactName, c.City)
Next
Acceso a datos con LINQ y VB9

• Es importante saber que LINQ mantiene la


consulta en la variable usada
• Cada vez que usemos la variable se ejecutará la
consulta
• Esto nos permite tener la consulta siempre
actualizada
• Es lo que se conoce como ejecución aplazada
(deferred execution)
Acceso a datos con LINQ y VB9

• Estos dos bucles mostrarán datos distintos, ya


que se ha cambiado un dato que se incluye en la
consulta
Dim clientes = From cli In ds.Customers _
Where cli.Country.StartsWith("U") _
Order By cli.ContactName _
Select cli

For Each c In clientes


Console.WriteLine("{0}: {1}, {2}", _
c.CustomerID, c.ContactName, c.Country)
Next

ds.Customers.Rows(18).Item("Country") = "Spain"

For Each c In clientes


Console.WriteLine("{0}: {1}, {2}", _
c.CustomerID, c.ContactName, c.Country)
Next
Acceso a datos con LINQ y VB9

• Si queremos que la consulta solo se ejecute una


vez o de forma inmediata, debemos usar algún
método que la "lance" y la saque del estado
"hibernado" en el que está
• Si queremos que esos datos siempre sean los
mismos y no nos interese que se actualicen,
usaremos lo que se conoce como ejecución
inmediata
Acceso a datos con LINQ y VB9

• El "truco" es asignar esos datos a una variable


usando el método ToArray
• También ToList o ToDictionary
• De esa forma, los datos que habrá en la variable
de la consulta permanecerán aunque se cambie
algo que afecte a la selección realizada
• Aunque si se cambian algunos de esos datos, se
reflejarán los cambios, pero no se "refrescará" la
consulta
Acceso a datos con LINQ y VB9

• Estos dos bucles mostrarán los mismos clientes, a


pesar de que se cambie el país de uno de ellos

Dim clientes = (From cli In ds.Customers _


Where cli.Country.StartsWith("U") _
Order By cli.ContactName _
Select cli).ToArray

For Each c In clientes


Console.WriteLine("{0}: {1}, {2}", _
c.CustomerID, c.ContactName, c.Country)
Next

ds.Customers.Rows(18).Item("Country") = "Spain"

For Each c In clientes


Console.WriteLine("{0}: {1}, {2}", _
c.CustomerID, c.ContactName, c.Country)
Next
DEMO
Ejecución aplazada y ejecución inmediata
Acceso a datos con LINQ y VB9

LINQ to SQL
• Las bases de datos relacionales con LINQ
• (por ahora solo se soporta SQL Server y SQL Server
Compact 3.5)
Acceso a datos con LINQ y VB9

• Existe una relación entre los objetos de LINQ y


los de la base de datos

LINQ to SQL Object Model Relational Data Model


Entity class Table
Class member Column
Association Foreign-key relationship
Method Stored Procedure or Function
Acceso a datos con LINQ y VB9

LINQ to SQL Entity Classes y las tablas


• Para ligar una tabla con una clase, definimos la
clase y los campos a los que queremos acceder
• Se necesita una referencia a System.Data.Linq.dll e importar los espacios de nombres:
System.Data.Linq.Mapping para los atributos y System.Data.Linq para el DataContext

<Table(Name:="Customers")> _
Public Class Customer
<Column()> _
Public CustomerID As String
<Column()> _
Public City As String
<Column()> _
Public ContactName As String
<Column()> _
Public Country As String
End Class
Acceso a datos con LINQ y VB9

• Por supuesto, solo podremos acceder a los


campos que hayamos definido en la clase

Dim sCnn = "Data Source = (local)\SQLEXPRESS; " & _


"Initial Catalog = Northwind; " & _
"Integrated Security = True"

Dim dc As New DataContext(sCnn)


Dim losClientes = dc.GetTable(Of Customer)()

Dim q1 = From cli In losClientes _


Where cli.Country.StartsWith("U") _
Order By cli.ContactName _
Select cli

For Each c In q1
Console.WriteLine("{0}: {1}, {2}", _
c.CustomerID, c.ContactName, c.Country)
Next
DEMO
Acceso a datos con LINQ (manual)
Acceso a datos con LINQ y VB9

• También podemos crear funciones para


asociarlas a procedimientos almacenados y más
cosas, pero lo más fácil es no tener que hacerlo a
mano...
• Ya que podemos usar el O/R Designer
• O/R Designer = Object Relational Designer

• Con ese diseñador, crear clases, métodos y


demás "monerías" solo es cuestión de...
• ¡arrastrar y soltar!
Acceso a datos con LINQ y VB9

• Con el diseñador de objetos relacionales,


arrastraremos las clases y los procedimientos
almacenados (o funciones) y se generará el
código para acceder a ellos directamente
• Es casi como los DataSet tipados, pero
accediendo directamente a los objetos de la base
de datos por medio de clases y métodos
Acceso a datos con LINQ y VB9
DEMO
LINQ to SQL, OR / Designer
DUDAS, PREGUNTAS???
Ya puedes conseguir
un libro sobre todas
las Novedades de
Visual Basic 2008
en formato PDF

http://www.elguille.info/NET/NovedadesVB9
Nuevo libro en preparación

Si te gustan los puntos y comas... tu libro es:

Aprenda C# 3.0 desde 0.0


Parte 3: Lo nuevo

http://www.elguille.info/NET/AprendaCSharp3
LINQ y el acceso a datos
con Visual Basic 2008

Guillermo ‘guille’ Som


mensaje@elguille.info
http://www.elguille.info/