Post on 07-Jun-2015
transcript
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
Fuentes de datos LINQ
LINQ
To
Objects
Objetos
LINQ
To
XML
<book>
<title/>
<author/>
<price/>
</book>
XML
LINQ to ADO.NET
LINQ
To
Datasets
LINQ
To
SQL
LINQ
To
Entities
Relacional
Otros…Visual Basic C#
.NET Language-Integrated Query
Un vistazo a LINQ
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
LINQ to Objects
DEMO
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
Ejecución aplazada y ejecución inmediata
DEMO
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
Acceso a datos con LINQ (manual)
DEMO
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
LINQ to SQL, OR / Designer
DEMO
DUDAS, PREGUNTAS???
http://www.elguille.info/NET/NovedadesVB9
Ya puedes conseguir
un libro sobre todas
las Novedades de
Visual Basic 2008
en formato PDF
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
Guillermo ‘guille’ Som
mensaje@elguille.info
http://www.elguille.info/
LINQ y el acceso a datos
con Visual Basic 2008