linq - medinfo.dist.unige.itsit\11_linq.pdf · di query alla sintassi dei linguaggi c# e visual...

32
LINQ - LINQ - Prof. Mauro Giacomini Anno Accademico: 2008-2009

Upload: doannguyet

Post on 20-Feb-2019

234 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: LINQ - medinfo.dist.unige.itSit\11_LINQ.pdf · di query alla sintassi dei linguaggi C# e Visual Basic. LINQ introduce modelli standard di facile apprendimento per llesecuzione'esecuzione

LINQ- LINQ -

Prof. Mauro Giacomini

Anno Accademico: 2008-2009

Page 2: LINQ - medinfo.dist.unige.itSit\11_LINQ.pdf · di query alla sintassi dei linguaggi C# e Visual Basic. LINQ introduce modelli standard di facile apprendimento per llesecuzione'esecuzione

Cos’è LINQ?Cos è LINQ?

LINQ (Language-Integrated Query) è un insieme difunzionalità di Visual Studio 2008 (ed è quindi un’innovazionedel framework 3.5) che estende le potenzialità di esecuzionedi query alla sintassi dei linguaggi C# e Visual Basic.

LINQ introduce modelli standard di facile apprendimento perl'esecuzione di query e l'aggiornamento dei datil esecuzione di query e l aggiornamento dei dati,consentendo l'estensione della tecnologia per supportarepraticamente qualsiasi tipo di archivio dati.

Page 3: LINQ - medinfo.dist.unige.itSit\11_LINQ.pdf · di query alla sintassi dei linguaggi C# e Visual Basic. LINQ introduce modelli standard di facile apprendimento per llesecuzione'esecuzione

Introduzione a LINQ in Visual BasicIntroduzione a LINQ in Visual Basic

Una query è un'espressione che recupera dati da un'origine dati.U a que y è u esp ess o e c e ecupe a da da u o g e daLe query sono espresse in un linguaggio di query dedicato. Nel tempo sono statisviluppati diversi linguaggi per i vari tipi di origini dati, ad esempio SQL perdatabase relazionali e XQuery per XML. Lo sviluppatore di applicazioni devey p pp pppertanto imparare un nuovo linguaggio di query per ogni tipo di origine dati oformato dati supportato.LINQ (Language-Integrated Query) semplifica la situazione offrendo un modellocoerente per l'utilizzo dei dati con tutti i diversi tipi di origini e formati dati.

Le operazioni di query LINQ sono costituite da tre azioni:• Ottenere l'origine o le origini dati.• Creare la query.• Eseguire la query.

In LINQ l'esecuzione di una query è distinta dalla creazione della query. I dati non vengono recuperati solo creando una query.

Page 4: LINQ - medinfo.dist.unige.itSit\11_LINQ.pdf · di query alla sintassi dei linguaggi C# e Visual Basic. LINQ introduce modelli standard di facile apprendimento per llesecuzione'esecuzione

Query

LINQ consente di eseguire query su dati in un database SQL Server XML matrici e insiemi

• Origine dei dati

LINQ consente di eseguire query su dati in un database SQL Server, XML, matrici e insiemiin memoria, dataset ADO.NET o qualsiasi altra origine dati remota o locale che supportaLINQ. È possibile fare tutto per questo con i comuni elementi del linguaggio Visual Basic.Poiché le query sono scritte in Visual Basic, i risultati vengono restituiti come oggettif Q Sfortemente tipizzati. Questi oggetti supportano IntelliSense, il che consente di scrivere ilcodice più velocemente e di individuare errori nelle query in fase di compilazione anziché infase di esecuzione.

Nella query vengono specificate le informazioni da recuperare dall'origine o dalle origini dati.È inoltre possibile specificare il modo in cui ordinare, raggruppare o strutturare le

• Creazione della query

informazioni prima che vengano restituite. L'espressione di query contiene tre clausole:From, Where e Select.

• Esecuzione della queryq y

Una query può essere eseguita appena definita (esecuzione immediata) oppure èpossibile archiviare la definizione ed eseguire la query in un secondo momento(esecuzione posticipata).( p p )

Page 5: LINQ - medinfo.dist.unige.itSit\11_LINQ.pdf · di query alla sintassi dei linguaggi C# e Visual Basic. LINQ introduce modelli standard di facile apprendimento per llesecuzione'esecuzione

Fasi di un’operazione di query - esempio -

‘ C i d ll t d i d ti

Fasi di un operazione di query esempio

‘ Creazione della sorgente dei datiDim db = New Northwind("c:\northwind\northwnd.mdf")

‘Creazione della queryCreazione della queryDim londonCustomers = From cust In db.Customers _ Where cust.City = "London" _ Select custSelect cust

‘Esecuzione (posticipata) della queryFor Each cust in londonCustomersFor Each cust in londonCustomers

Console.WriteLine("id = {0}, City = {1}", cust.CustomerID, cust.City)

Next

Page 6: LINQ - medinfo.dist.unige.itSit\11_LINQ.pdf · di query alla sintassi dei linguaggi C# e Visual Basic. LINQ introduce modelli standard di facile apprendimento per llesecuzione'esecuzione

Provider LINQ

• Un provider LINQ Visual Basic esegue il mapping di query LINQ sull'origine dati su cui eseguire una querycui eseguire una query. • Quando si scrive una query LINQ, il provider prende tale query e la traduce in comandi che l'origine dati sarà in grado di eseguire. • ll provider converte anche i dati dall'origine negli oggetti che costituiscono il risultatoll provider converte anche i dati dall origine negli oggetti che costituiscono il risultato della query. • Infine, converte gli oggetti in dati quando si inviano aggiornamenti all'origine dati.

Visual Basic include i seguenti provider LINQ

LINQ to Objects LINQ to DataSet

LINQ to SQL LINQ to XML

Page 7: LINQ - medinfo.dist.unige.itSit\11_LINQ.pdf · di query alla sintassi dei linguaggi C# e Visual Basic. LINQ introduce modelli standard di facile apprendimento per llesecuzione'esecuzione

Operatori di query LINQ in Visual Basic

• Clausola FROM

Per iniziare una query è obbligatoria una clausola From o una clausola Aggregate.La clausola From specifica un insieme di origine e una variabile di iterazione per una query.

‘Rit il d ll’ i dDim names = From cust In customers ‘Ritorna il nome dell’azienda per tutti i clienti

il cui stato è uguale a ‘WA’

Dim names = From cust In customersWhere cust.State = “WA”Select cust.Companyname

• Clausola SELECT

Facoltativo Dichiara un insieme di variabili di iterazione per una queryFacoltativo. Dichiara un insieme di variabili di iterazione per una query.

Dim customerlist = From cust In customers

‘Ritorna il nome dell’azienda ed il valore dell’ID per ogni cliente come una collection di un nuovo tipo

Select cust.Companyname, cust.ID

Se non è specificata alcuna clausola Select, le variabili di iterazione per la query consistono ll i bili di it i ifi t d ll l l F A tnelle variabili di iterazione specificate dalla clausola From o Aggregate.

Page 8: LINQ - medinfo.dist.unige.itSit\11_LINQ.pdf · di query alla sintassi dei linguaggi C# e Visual Basic. LINQ introduce modelli standard di facile apprendimento per llesecuzione'esecuzione

Operatori di query LINQ in Visual Basic (1)

• Clausola WHERE

Facoltativo. Specifica una condizione di filtro per una query.

‘Ritorna tutti i nomi dei prodotti la cui categoria è ‘Beverages’

Dim names = From product In productsWhere procuct.Category = “Beverages”Select product.Name

• Clausola ORDER BY

Facoltativo. Specifica l'ordinamento per le colonne in una query. y

Dim titlesAscendingPrice = From b In Books

‘Ritorna una lista di libri ordinati per prezzo in ordine ascendente

gOrder By b.Price

Page 9: LINQ - medinfo.dist.unige.itSit\11_LINQ.pdf · di query alla sintassi dei linguaggi C# e Visual Basic. LINQ introduce modelli standard di facile apprendimento per llesecuzione'esecuzione

Operatori di query LINQ in Visual Basic (2)

• Clausola JOIN

Facoltativo. Combina due insiemi in un unico insieme.

‘Ritorna un insieme combinato di tutti i processi e delle corrispondenti descrizioni

Dim processes = From proc In Process.GetProcessesJoin desc In processDescriptionsOn proc.ProcessName Equals desc.ProcessNameSelect proc.ProcessName, proc.Id, desc.Description

• Clausola GROUP BYClausola GROUP BY

Facoltativo. Raggruppa gli elementi di un risultato della query.

Di d F d I d Li t

‘Ritorna una lista di ordini raggruppati secondo la data dell’ordine e ordinati in ordine ascendente

Dim orders = From order In orderListOrder By order.OrderDateGroup By OrderDate = order.OrderDateInto OrdersByDate GroupInto OrdersByDate = Group

Page 10: LINQ - medinfo.dist.unige.itSit\11_LINQ.pdf · di query alla sintassi dei linguaggi C# e Visual Basic. LINQ introduce modelli standard di facile apprendimento per llesecuzione'esecuzione

Operatori di query LINQ in Visual Basic (3)

Clausola GROUP JOIN• Clausola GROUP JOIN

Facoltativo. Combina due insiemi in un unico insieme gerarchico.

Di t Li t F t I t

‘Ritorna una collezione combinata di clienti e ordini

Dim customerList = From cust In customersGroup Join ord In orders Oncust.CustomerID Equals ord.CustomerIDInto CustomerOrders GroupInto CustomerOrders = Group,

OrderTotal = Sum(ord.Total)Select cust.CompanyName, cust.CustomerID,

CustomerOrders OrderTotalCustomerOrders, OrderTotal

Page 11: LINQ - medinfo.dist.unige.itSit\11_LINQ.pdf · di query alla sintassi dei linguaggi C# e Visual Basic. LINQ introduce modelli standard di facile apprendimento per llesecuzione'esecuzione

Operatori di query LINQ in Visual Basic (4)

• Clausola AGGREGATE

Una clausola Aggregate applica una o più funzioni di aggregazione a un insieme. Ad esempio, èpossibile utilizzare la clausola Aggregate per calcolare una somma di tutti gli elementi restituitida una query.

Dim orderTotal= Aggregate order In Orders

‘Ritorna la somma di tutti i totali degli ordini

gg gInto Sum(order.Total)

È inoltre possibile utilizzare la clausola Aggregate per modificare una query. Ad esempio, ègg g ypossibile utilizzare la clausola Aggregate per eseguire un calcolo su un insieme di querycorrelato.

‘Ritorna il nome dell’azienda del cliente ed il totale degli ordini più grande per ogni cliente

Dim customerMax = From cust In CustomersAggregate order In cust.OrdersInto MaxOrder = Max(order Total)Into MaxOrder = Max(order.Total)Select cust.CompanyName, MaxOrder

Page 12: LINQ - medinfo.dist.unige.itSit\11_LINQ.pdf · di query alla sintassi dei linguaggi C# e Visual Basic. LINQ introduce modelli standard di facile apprendimento per llesecuzione'esecuzione

Operatori di query LINQ in Visual Basic (5)

• Clausola LET

Facoltativo. Calcola un valore e lo assegna a una nuova variabile nella query.

Dim discountedProducts = From prod In products

‘Ritorna una lista di prodotti che sono stati scontati del 10%

p pLet Discount = prod.UnitPrice * (0.1)Where Discount >= 50Select prod.ProductName,

prod.UnitPrice, Discount

• Clausola DISTINCTFacoltativo Limita i valori della variabile di iterazione corrente per eliminare i valori duplicati neiFacoltativo. Limita i valori della variabile di iterazione corrente per eliminare i valori duplicati nei risultati della query.

‘Ritorna una lista di città senza duplicati

Dim cities = From cust In customersSelect cust.CityDistinctDistinct

Page 13: LINQ - medinfo.dist.unige.itSit\11_LINQ.pdf · di query alla sintassi dei linguaggi C# e Visual Basic. LINQ introduce modelli standard di facile apprendimento per llesecuzione'esecuzione

Operatori di query LINQ in Visual Basic (6)

• Clausola SKIP

Facoltativo Ignora un numero specificato di elementi in un insieme e quindi restituisce gliFacoltativo. Ignora un numero specificato di elementi in un insieme e quindi restituisce gli elementi rimanenti.

‘Ritorna una lista di clienti. I primi 10 clienti vengono ignorati, mentre vengono ritornati i rimanenti.

Dim customerList = From cust In customersSkip 10

• Clausola SKIP WHILE

Facoltativo. Ignora gli elementi in un insieme finché la condizione specificata è true e quindi restituisce gli elementi rimanenti.

‘Ritorna una lista di clienti. La query ignora tutti i clienti fino al primo cliente per cui IsSubscriber ritorna falso.

Dim customerList = From cust In customersSkip While IsSubscriber(cust)

Page 14: LINQ - medinfo.dist.unige.itSit\11_LINQ.pdf · di query alla sintassi dei linguaggi C# e Visual Basic. LINQ introduce modelli standard di facile apprendimento per llesecuzione'esecuzione

Operatori di query LINQ in Visual Basic (7)

• Clausola TAKE

Facoltativo. Restituisce un numero specificato di elementi contigui dall'inizio di un insieme.

Dim customerList = From cust In customers

‘Ritorna i primi 10 clienti

Dim customerList = From cust In customersTake 10

• Clausola TAKE WHILEClausola TAKE WHILE

Facoltativo. Include gli elementi in un insieme finché la condizione specificata è true e quindi ignora gli elementi rimanenti.

Dim customersWithOrders = From cust In customers

‘Ritorna una lista di clienti. La query ritorna i clienti fino al primo cliente per cui HasOrders ritorna falso. Quel cliente e tutti i rimanenti vengono ignorati.

Order By cust.Orders.CountDescendingTake While HasOrders(cust)

Page 15: LINQ - medinfo.dist.unige.itSit\11_LINQ.pdf · di query alla sintassi dei linguaggi C# e Visual Basic. LINQ introduce modelli standard di facile apprendimento per llesecuzione'esecuzione

Esecuzione query

‘Origine dati.

•Esecuzione posticipata:g

Dim numbers() As Integer = {0,1,2,3,4,5,6}

‘Creazione query.Dim evensQuery = From num In numbers

Where num Mod 2 = 0Select Num

‘Esecuzione query che da come risultato una sequenza divalori.

h bFrom Each number In evensQueryConsole.Write(number & “ “)

Next

La query viene creata ma non eseguita immediatamente. La definizione della query vieneinvece archiviata nella variabile di query evensQuery. La query viene eseguitasuccessivamente, in genere utilizzando un ciclo For Each che restituisce una sequenza divalori o applicando un operatore di query standard, ad esempio Count o Max. Questoprocesso viene denominato esecuzione posticipata.

Page 16: LINQ - medinfo.dist.unige.itSit\11_LINQ.pdf · di query alla sintassi dei linguaggi C# e Visual Basic. LINQ introduce modelli standard di facile apprendimento per llesecuzione'esecuzione

Esecuzione query (1)

‘Esecuzione query che da come risultato un singolo valore.Dim e ens e ensQ er Co nt()Dim evens = evensQuery.Count()

•Esecuzione immediata:Esecuzione immediata:

Nell'esecuzione immediata la query viene eseguita al momento della definizione.L'esecuzione viene attivata quando si applica un metodo che richiede l'accesso ai singolielementi del risultato della query L'esecuzione immediata viene spesso forzata utilizzandoelementi del risultato della query. L esecuzione immediata viene spesso forzata utilizzandouno degli operatori di query standard che restituiscono singoli valori, ad esempio Count,Max, Average e First.

Dim numEvens = (From num In numbersWhere num Mod 2 = 0Select num).Count() Select num).Count()

Page 17: LINQ - medinfo.dist.unige.itSit\11_LINQ.pdf · di query alla sintassi dei linguaggi C# e Visual Basic. LINQ introduce modelli standard di facile apprendimento per llesecuzione'esecuzione

LINQ to SQL

Utilizzando LINQ to SQL è possibile avvalersi della tecnologia LINQ per accedere ai databaseSQL come se si trattasse di un insieme in memoria

• Operazioni eseguibili con LINQ to SQL

ÈÈ possibile creare query per ottenere informazioni ed eseguire operazioni di inserimento,aggiornamento ed eliminazione di dati dalle tabelle.

S l i• SelezionePer eseguire una selezione (proiezione) è sufficiente scrivere una query LINQ nel propriolinguaggio di programmazione e successivamente eseguirla per recuperare i risultati. In LINQ toSQL tutte le operazioni indispensabili vengono convertite nelle operazioni SQL necessarie conSQL, tutte le operazioni indispensabili vengono convertite nelle operazioni SQL necessarie concui si ha dimestichezza.

• Inserimento

Per eseguire un'operazione Insert SQL, aggiungere semplicemente oggetti al modello a oggetticreato e chiamare SubmitChanges su DataContext.Nell'esempio seguente vengono aggiunti un nuovo cliente e informazioni sul cliente alla tabellaCustomers utilizzando InsertOnSubmit.

Page 18: LINQ - medinfo.dist.unige.itSit\11_LINQ.pdf · di query alla sintassi dei linguaggi C# e Visual Basic. LINQ introduce modelli standard di facile apprendimento per llesecuzione'esecuzione

LINQ to SQL (1)Dim nw As New Northwnd(“C:\northwnd.mdf”)Dim cust As New Customer With {.CompanyName = “SomeCompany”,

.City = “London”,C.CustomerID = 98128,

.PostalCode = 55555, .Phone = “555-555-5555”}

nw.Customers.InsertOnSubmit(cust)nw.SubmitChanges()

• AggiornamentoPer eseguire un'operazione Update per una voce del database, bisogna recuperare innanzituttotale voce e modificarla direttamente nel modello a oggetti. Dopo avere modificato l'oggetto,gg p gg ,chiamare SubmitChanges su DataContext per aggiornare il database.Nell'esempio seguente vengono recuperati tutti i clienti dell'area londinese. Il nome della cittàviene quindi modificato da "London" in "London - Metro", infine viene chiamato SubmitChangesper inviare le modifiche al databaseper inviare le modifiche al database.

Dim nw As New Northwnd(“C:\northwnd.mdf”)Dim cityNameQuery =

From cust In nw.Customersh Ci C i “ d ”Where cust.City.Contains(“London”)

Select custFor Each customers In cityNameQuery

If customer.City = “London” ThenCustomer.City = “London – Metro”

End IfNextnw.SubmitChanges()

Page 19: LINQ - medinfo.dist.unige.itSit\11_LINQ.pdf · di query alla sintassi dei linguaggi C# e Visual Basic. LINQ introduce modelli standard di facile apprendimento per llesecuzione'esecuzione

LINQ to SQL (2)

• Eliminazione

Per eseguire un'operazione Delete per un elemento rimuovere l'elemento dall'insieme alPer eseguire un'operazione Delete per un elemento, rimuovere l'elemento dall'insieme alquale appartiene, quindi chiamare SubmitChanges su DataContext per eseguire il commitdella modifica.Nell'esempio seguente il cliente con il codice CustomerID 98128 viene recuperato dalp g pdatabase. Quindi, dopo la conferma che la riga del cliente è stata recuperata, viene chiamatoDeleteOnSubmit per rimuovere quell'oggetto dall'insieme. Infine viene chiamatoSubmitChanges per inoltrare l'operazione di eliminazione al database.

Dim nw As New Northwnd(“C:\northwnd.mdf”)Dim deleteIndivCust =

From cust In nw.CustomersWhere cust.customerID = 98128Select cust

If deleteIndivCust.Count > 0 Thennw.Customers.DeleteOnSubmit(deleteIndivCust.First)nw.SubmitChanges()

End If

Page 20: LINQ - medinfo.dist.unige.itSit\11_LINQ.pdf · di query alla sintassi dei linguaggi C# e Visual Basic. LINQ introduce modelli standard di facile apprendimento per llesecuzione'esecuzione

LINQ to DataSet

Dataset è uno dei componenti più utilizzati di ADO.NET. Rappresenta un elemento chiavedel modello di programmazione disconnesso su cui si basa ADO NET e consente didel modello di programmazione disconnesso su cui si basa ADO.NET e consente dimemorizzare in modo esplicito nella cache dati di origini dati diverse.

Una tecnica comune utilizzata per ridurre il numero di richieste su un database consistenell'utilizzare DataSet per la memorizzazione nella cache di livello intermedio.

Esempio:Si consideri un'applicazione Web ASP.NET basata sui dati. Spesso, una parte significativadei dati dell'applicazione non viene modificata frequentemente ed è comune a più sessioni outenti Tali dati possono essere mantenuti in memoria sul server Web in modo da ridurre ilutenti. Tali dati possono essere mantenuti in memoria sul server Web, in modo da ridurre ilnumero di richieste al database e velocizzare le interazioni utente.

Un altro aspetto utile di DataSet è che consente a un'applicazione di portare nello spaziodell'applicazione sottoinsiemi di dati da una o più origini dati. L'applicazione può quindimodificare i dati in memoria, mantenendo comunque la propria forma relazionale.

Page 21: LINQ - medinfo.dist.unige.itSit\11_LINQ.pdf · di query alla sintassi dei linguaggi C# e Visual Basic. LINQ introduce modelli standard di facile apprendimento per llesecuzione'esecuzione

LINQ to DataSet (1)

DataSet dispone di funzionalità limitate di query

Con LINQ to DataSet è più facile e veloce eseguire una query su dati memorizzati nella cache di un oggetto dataset Queste query sono espressememorizzati nella cache di un oggetto dataset. Queste query sono espresse

nel linguaggio di programmazione stesso, anziché come valori letterali stringa incorporati nel codice dell'applicazione. Gli sviluppatori non devono pertanto

imparare un diverso linguaggio di query.

Prima di poter eseguire query su un oggetto dataset con LINQ to DataSet è necessarioPrima di poter eseguire query su un oggetto dataset con LINQ to DataSet, è necessariopopolare DataSet. È possibile caricare dati in un oggetto DataSet in diversi modi, adesempio utilizzando la classe DataAdapter o LINQ to SQL. È possibile iniziare a eseguirequery su un oggetto DataSet dopo avervi caricato i dati. La formulazione di query con

Q S Q ( Q )LINQ to DataSet è simile all'utilizzo di LINQ (Language-Integrated Query) su altre originidati con supporto LINQ. È possibile eseguire query LINQ su singole tabelle di un DataSeto su più di una tabella utilizzando gli operatori di query standard Join e GroupJoin.

Page 22: LINQ - medinfo.dist.unige.itSit\11_LINQ.pdf · di query alla sintassi dei linguaggi C# e Visual Basic. LINQ introduce modelli standard di facile apprendimento per llesecuzione'esecuzione

LINQ to DataSet (2)

• Applicazioni a più livelli

Le applicazioni dati a più livelli sono applicazioni mirate ai dati separate in più livelli logici.Una tipica applicazione a più livelli include un livello di presentazione, un livello intermedioe un livello dati. La separazione dei componenti dell'applicazione in livelli aumenta la

tibilità l l bilità d ll' li igestibilità e la scalabilità dell'applicazione.

In che modo LINQ to DataSet si correla a dataset e si inserisce in un'applicazione a piùlivelli?

Page 23: LINQ - medinfo.dist.unige.itSit\11_LINQ.pdf · di query alla sintassi dei linguaggi C# e Visual Basic. LINQ introduce modelli standard di facile apprendimento per llesecuzione'esecuzione

Esecuzione di una query su DataSet

• Query su una singola tabella

Le query LINQ possono essere eseguite su origini dati che implementano l'interfacciaLe query LINQ possono essere eseguite su origini dati che implementano l interfacciaIEnumerable o l'interfaccia IQueryable. Poiché la classe DataTable non implementa nessuna diqueste due interfacce, è necessario chiamare il metodo AsEnumerable se si desidera utilizzareDataTable come origine nella clausola From della query LINQ.

Dim ds As New DataSet()ds.Locale = CultureInfo.InvariantCulture

‘Utilizzare il metodo FillDataSet per caricare i dati nel datasetFillDataSet(ds)

Dim orders As DataTable = ds Tables(“SalesOrderHeader”)Dim orders As DataTable = ds.Tables( SalesOrderHeader )Dim query =

From order In orders.AsEnumerable()Where order.Field(Of Boolean)(“OnlineOrderFlag”) = TrueSelect New With{Select New With{

.SalesOrderID = order.Field(Of Integer)(“SalesOrderID”),

.OrderDate = order.Field(Of Datetime)(“OrderDate”),

.SalesOrderNumber = order.Field(Of String)(“SalesOrderNumber”)}}

Page 24: LINQ - medinfo.dist.unige.itSit\11_LINQ.pdf · di query alla sintassi dei linguaggi C# e Visual Basic. LINQ introduce modelli standard di facile apprendimento per llesecuzione'esecuzione

Esecuzione di una query su DataSet (1)

For Each onlineOrder In queryConsole Write("Order ID: " & onlineOrder SalesOrderID) Console.Write("Order ID: " & onlineOrder.SalesOrderID) Console.Write(" Order date: " & onlineOrder.OrderDate) Console.WriteLine(" Order number: " & onlineOrder.SalesOrderNumber)

Next

• Vengono utilizzati due operatori di query standard: Where e Select.• La clausola Where filtra la sequenza in base a una condizione, in questo caso che OnlineOrderFlag siaimpostato su trueimpostato su true.• L'operatore Select alloca e restituisce un oggetto enumerabile che acquisisce gli argomenti passatiall'operatore. Nell'esempio viene creato un tipo anonimo con tre proprietà: SalesOrderID, OrderDate eSalesOrderNumber.• I valori di queste tre proprietà vengono impostati sui valori delle colonne SalesOrderID OrderDate e• I valori di queste tre proprietà vengono impostati sui valori delle colonne SalesOrderID, OrderDate eSalesOrderNumber della tabella SalesOrderHeader.• Il ciclo Foreach enumera quindi gli oggetti enumerabili restituiti da Select e produce i risultati dellaquery.• Poiché la query è un tipo Enumerable la valutazione della query viene posticipata finché non viene• Poiché la query è un tipo Enumerable la valutazione della query viene posticipata finché non vieneeseguita un'iterazione della variabile di query in un ciclo Foreach.

Page 25: LINQ - medinfo.dist.unige.itSit\11_LINQ.pdf · di query alla sintassi dei linguaggi C# e Visual Basic. LINQ introduce modelli standard di facile apprendimento per llesecuzione'esecuzione

LINQ to Objects

Il termine LINQ to Objects si riferisce all'utilizzo diretto delle query LINQ con un insiemeIenumerable o IEnumerable(T) senza l'utilizzo di un provider LINQ intermedio o di un'APIIenumerable o IEnumerable(T), senza l utilizzo di un provider LINQ intermedio o di un APIcome LINQ to SQL o LINQ to XML. È possibile utilizzare LINQ per eseguire una query suqualsiasi insieme enumerabile come List(T), Array,etc.

Procedura: eseguire una query su un ArrayList con LINQ

Quando si utilizza LINQ per eseguire una query su insiemi Ienumerable non generici, adg y gesempio ArrayList, è necessario dichiarare in modo esplicito il tipo della variabile diintervallo per riflettere il tipo specifico degli oggetti nell'insieme. Ad esempio, se si ha unoggetto ArrayList di oggetti Student la Clausola From deve essere analoga a quellariportata di seguito:riportata di seguito:

Dim query = From student As Student In arrList…

Specificando il tipo della variabile di intervallo, viene eseguito il cast di ogni elementopresente nell'oggetto ArrayList su un oggetto Student.

Page 26: LINQ - medinfo.dist.unige.itSit\11_LINQ.pdf · di query alla sintassi dei linguaggi C# e Visual Basic. LINQ introduce modelli standard di facile apprendimento per llesecuzione'esecuzione

LINQ to Objects (1)

Nell'esempio seguente viene illustrata una query semplice su un oggetto ArrayList. Inquesto esempio vengono utilizzati gli inizializzatori di oggetto quando il codice chiama ilmetodo Add, sebbene non sia un requisito.Imports System.CollectionsImports System.Ling

Module Module1

Public Class StudentPublic FirstName As StringPublic FirstName As StringPublic LastName As StringPublic Scores As Integer()

End Class

Sub Main()Dim student1 As New Student With {.FirstName = “Svetlana”,

.LastName = “Omelchenko”, Scores = New Integer() {98 92 81 60}}.Scores = New Integer() {98,92,81,60}}

Dim student2 As New Student With {.FirstName = “Claire”, .LastName = “O’Donnell”, .Scores = New Integer() {75,84,91,39}}

Dim student3 As New Student With { FirstName = “Cesar” Dim student3 As New Student With {.FirstName = Cesar , .LastName = “Garcia”, .Scores = New Integer() {97,89,85,82}}

Page 27: LINQ - medinfo.dist.unige.itSit\11_LINQ.pdf · di query alla sintassi dei linguaggi C# e Visual Basic. LINQ introduce modelli standard di facile apprendimento per llesecuzione'esecuzione

LINQ to Objects (2)

Dim student4 As New Student With {.FirstName = “Sven”, .LastName = “Mortensen”, .Scores = New Integer() {88,94,65,91}}

Dim arrList As New ArrayList()arrList.Add(student1)arrList.Add(student2)arrList.Add(student3)arrList.Add(student4)

Dim query = From student As Student In arrListWhere student.Scores(0) > 95Select student

For Each student As Student In queryConsole.Writeline(student.LastName & “: ” &

student.Scores(0))Next

Console.Writeline(“Press any key to exit.”)Console.ReadKey()

End Sub

‘Output:‘ Omelchenko: 98‘ Garcia: 97

Page 28: LINQ - medinfo.dist.unige.itSit\11_LINQ.pdf · di query alla sintassi dei linguaggi C# e Visual Basic. LINQ introduce modelli standard di facile apprendimento per llesecuzione'esecuzione

LINQ to XML

LINQ to XML è un'interfaccia di programmazione XML in memoria con supporto LINQ chegconsente di utilizzare codice XML dall'interno dei linguaggi di programmazione di .NETFramework.

È simile al modello DOM (Document Object Model) in quanto porta in memoria il documentoÈ simile al modello DOM (Document Object Model) in quanto porta in memoria il documentoXML. È quindi possibile eseguire query e modificare il documento e dopo averlo modificatosalvarlo in un file o serializzarlo e inviarlo tramite rete. LINQ to XML è tuttavia diverso daDOM. Fornisce infatti un nuovo modello a oggetti, più leggero e facile da utilizzare, chesfrutta i miglioramenti apportati al linguaggio in Visual C# 2008.

Il principale vantaggio di LINQ to XML è costituito dall'integrazione con LINQ (Language-Integrated Query) Grazie a tale integrazione è possibile scrivere query sul documento XMLIntegrated Query). Grazie a tale integrazione è possibile scrivere query sul documento XMLin memoria per recuperare insiemi di elementi e di attributi.

La funzionalità LINQ di LINQ to XML consente di eseguire query su codice XML. AdQ Q g q yesempio, si supponga di avere un tipico ordine di acquisto in formato XML come descrittonel file XML di esempio: Purchase Order.xml. Utilizzando LINQ to XML, è possibile eseguirela query seguente per ottenere il valore dell'attributo relativo al numero di parte di ciascun

ti l i l d ll' di di i tarticolo incluso dell'ordine di acquisto:

Page 29: LINQ - medinfo.dist.unige.itSit\11_LINQ.pdf · di query alla sintassi dei linguaggi C# e Visual Basic. LINQ introduce modelli standard di facile apprendimento per llesecuzione'esecuzione

LINQ to XML (1)

<?xml version="1.0"?>

PurchaseOrder.xml:

<PurchaseOrder PurchaseOrderNumber="99503“ OrderDate="1999-10-20">

<Address Type="Shipping"> <Name>Ellen Adams</Name> <Street>123 Maple Street</Street> <City>Mill Valley</City> <State>CA</State> <Zip>10999</Zip> p p<Country>USA</Country>

</Address>

<Address Type="Billing"> yp g<Name>Tai Yee</Name> <Street>8 Oak Avenue</Street> <City>Old Town</City> <State>PA</State> <Zip>95819</Zip> <Country>USA</Country>

</Address>

<DeliveryNotes>Please leave packages in shed by driveway.</DeliveryNotes>…………

Page 30: LINQ - medinfo.dist.unige.itSit\11_LINQ.pdf · di query alla sintassi dei linguaggi C# e Visual Basic. LINQ introduce modelli standard di facile apprendimento per llesecuzione'esecuzione

LINQ to XML (2)

………<Items>

It P tN b AA<Item PartNumber="872-AA"> <ProductName>Lawnmower</ProductName><Quantity>1</Quantity> <USPrice>148.95</USPrice> C t C fi thi i l t i C t<Comment>Confirm this is electric</Comment>

</Item>

<Item PartNumber="926-AA"> P d tN B b M it P d tN<ProductName>Baby Monitor</ProductName>

<Quantity>2</Quantity> <USPrice>39.98</USPrice> <ShipDate>1999-05-21</ShipDate>

/It </Item> </Items>

</PurchaseOrder>

Query in Visual Basic:

Dim partNos = From item In purchaseOrder...<Item>

Query in Visual Basic:

Select item.@PartNumber

Page 31: LINQ - medinfo.dist.unige.itSit\11_LINQ.pdf · di query alla sintassi dei linguaggi C# e Visual Basic. LINQ introduce modelli standard di facile apprendimento per llesecuzione'esecuzione

LINQ to XML (3)

Oltre alle funzionalità LINQ di LINQ to XML, è importante sottolineare che LINQ to XMLinclude un'interfaccia di programmazione XML migliorata. LINQ to XML consente diinclude un interfaccia di programmazione XML migliorata. LINQ to XML consente dieseguire tutte le operazioni necessarie quando si programma con XML, tra cui:

caricare codice XML da file o flussi; i li di XML i fil fl i serializzare codice XML in file o flussi; creare codice XML nuovo utilizzando la costruzione funzionale; modificare la struttura ad albero XML in memoria utilizzando metodi specifici; convalidare strutture ad albero XML utilizzando lo schema XSD; convalidare strutture ad albero XML utilizzando lo schema XSD; utilizzare una combinazione di queste funzionalità per trasformare strutture ad alberoXML da una forma in un’altra.

Creazione di strutture ad albero XML

Riveste particolare significato la semplicità con cui è possibile creare strutture ad alberoXML. In Visual Basic il codice per costruire la struttura ad albero XML prevede l'utilizzo divalori letterali XML:

Page 32: LINQ - medinfo.dist.unige.itSit\11_LINQ.pdf · di query alla sintassi dei linguaggi C# e Visual Basic. LINQ introduce modelli standard di facile apprendimento per llesecuzione'esecuzione

LINQ to XML (4)

Dim contacts = Dim contacts = <Contacts>

<Contact> <Name>Patrick Hines</Name> <Phone Type="Home">206-555-0144</Phone> <Phone Type="Work">425-555-0145</Phone> <Address>

<Street1>123 Main St</Street1> <Street1>123 Main St</Street1> <City>Mercer Island</City> <State>WA</State> <Postal>68042</Postal>

</Address> </Contact>

</Contacts>

Il compilatore Visual Basic traduce i valori letterali XML in chiamate al metodo in LINQ toXML.