Este documento presenta una introducción a LINQ y su uso para acceder a datos en Visual Basic 2008. Explica las variantes de LINQ como LINQ to Objects, LINQ to XML y LINQ to ADO.NET. Se detalla cómo LINQ permite consultar datos almacenados en memoria, XML y bases de datos relacionales como SQL Server. También cubre conceptos clave como la ejecución aplazada y ejecución inmediata de consultas LINQ.
3. 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
3
4. 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
4
5. 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
5
7. 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
7
8. 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
9
10. Acceso a datos con LINQ y VB9
LINQ to DataSet
• Permite usar ADO.NET 2.0 con LINQ
11
11. 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
12
12. 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(quot;Uquot;) _
Order By cli.ContactName _
Select cli
For Each c In clientes
Console.WriteLine(quot;{0}, {1}quot;, c.ContactName, c.City)
Next
13
13. 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)
14
14. 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(quot;Uquot;) _
Order By cli.ContactName _
Select cli
For Each c In clientes
Console.WriteLine(quot;{0}: {1}, {2}quot;, _
c.CustomerID, c.ContactName, c.Country)
Next
ds.Customers.Rows(18).Item(quot;Countryquot;) = quot;Spainquot;
For Each c In clientes
Console.WriteLine(quot;{0}: {1}, {2}quot;, _
c.CustomerID, c.ContactName, c.Country)
Next
15
15. 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 quot;lancequot; y la saque del estado
quot;hibernadoquot; 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
16
16. Acceso a datos con LINQ y VB9
• El quot;trucoquot; 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 quot;refrescaráquot; la
consulta
17
17. 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(quot;Uquot;) _
Order By cli.ContactName _
Select cli).ToArray
For Each c In clientes
Console.WriteLine(quot;{0}: {1}, {2}quot;, _
c.CustomerID, c.ContactName, c.Country)
Next
ds.Customers.Rows(18).Item(quot;Countryquot;) = quot;Spainquot;
For Each c In clientes
Console.WriteLine(quot;{0}: {1}, {2}quot;, _
c.CustomerID, c.ContactName, c.Country)
Next
18
19. 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)
20
20. 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
21
21. 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:=quot;Customersquot;)> _
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
22
22. Acceso a datos con LINQ y VB9
• Por supuesto, solo podremos acceder a los
campos que hayamos definido en la clase
Dim sCnn = quot;Data Source = (local)SQLEXPRESS; quot; & _
quot;Initial Catalog = Northwind; quot; & _
quot;Integrated Security = Truequot;
Dim dc As New DataContext(sCnn)
Dim losClientes = dc.GetTable(Of Customer)()
Dim q1 = From cli In losClientes _
Where cli.Country.StartsWith(quot;Uquot;) _
Order By cli.ContactName _
Select cli
For Each c In q1
Console.WriteLine(quot;{0}: {1}, {2}quot;, _
c.CustomerID, c.ContactName, c.Country)
Next
23
24. 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 quot;moneríasquot; solo es cuestión de...
• ¡arrastrar y soltar!
25
25. 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
26