6 messaggi dal 01 agosto 2006
Salve a tutti e scusate la domanda probabilmente banale, ma sconto il carattere hobbistico della mia preparazione in tema di programmazione.
Si tratta di questo: ho una relazione molti a molti tra 2 tabelle (Libri - Autori), affidata alla solita terza tabella intermedia (LibriAutori).
Sto tentando di utilizzare Linq per fare una query che mi raggruppi gli Autori così da mostrare in una grid, in una relazione master - detail, i vari libri scritti da ciascun autore. Ad esempio una query del genere sui seguenti record, estrapolati dalle tre tabelle sopra menzionate,

Rossi - Libro1
Bianchi - Libro2
Verdi - Libro 3
Verdi - Libro 2
Rossi - Libro 4

dovrebbe restituire un risultato analogo al seguente:

Rossi
Libro1
Libro4
Verdi
Libro3
Libro2
Bianchi
Libro2

Di fatto, concettualmente si tratta di ripristinare una relazione uno a molti tra la tabella Autori e la tabella Libri, ma, sul piano pratico, dopo essere riuscito a ragguppare gli autori e a selezionare i rispettivi libri, non riesco poi a creare la relazione tra le due entità che mi consenta di mostrare il tutto nel controllo grid come relazione master detail.
C'è qualche anima pia esperta che possa darmi una mano?
Ringrazio tanto sin d'ora.

Francesco

PS Ovviamente anche una soluzione in SQL andrebbe benissimo!
Ciao!

Allora, Linq to Sql non consente il mapping diretto di una relazione many-to-many, quindi il tuo problema è che dentro Autore non hai
List<Libro>
ma
List<LibroAutore>, con LibroAutore che a sua volta ha una proprietà di tipo Libro.

Ciò che puoi fare allora è creare una proprietà di questo tipo sfruttando il meccanismo delle partial class:
partial class Autore
{
    public IEnumerable<Libro> Libri
    {
        get { return this.LibriAutori.Select(la => la.Libro); }
    }
}


In questo modo puoi scrivere qualcosa tipo
using (DataClasses1DataContext dc = new DataClasses1DataContext())
{
    var autori = from a in dc.Autori
                 select a;

    foreach (var autore in autori)
    {
        Console.WriteLine(autore.Nome);
        foreach (var libro in autore.Libri)
        {
            Console.WriteLine(libro.Titolo);
        }
    }
}


Ricorda però di settare le LoadOption in modo da caricare insieme LibroAutore e Libro per evitare di sovraccaricare il db con troppe query.

Ciao,
m.
6 messaggi dal 01 agosto 2006
Grazie davvero tanto, Cradle,

provo subito ad implementare la soluzione che mi hai suggerito.
Ehm, già che ci sei... come traduco in vb "(la => la.Libro)" ?
Oppure, non volendoti far perdere tempo, mi dici solo che rappresenta la variabile "la"? e la sintassi "=>"?

Grazie ancora per la disponibilità.
F.
Se sei su .Net 3.5, scrivila esattamente in quel modo, è una lambda expression. Altrimenti la cosa è un po' più complicata, bisogna istanziare un delegate, nel caso ti spiego
6 messaggi dal 01 agosto 2006
Ciao Cradle,

grazie a te ho risolto, dopo aver studiato un po' su internet le lambda expressions.

Alla fine ho tradotto

return this.LibriAutori.Select(la => la.Libro);
in

Return Me.LibriAutori.Select(Function(s) s.Libro)

Grazie ancora.


Francesco
6 messaggi dal 01 agosto 2006
Uffaaaaa, e invece non ho risolto....
In realtà l'esempio che mi hai gentilmente fornito funziona egregiamente ma l'aver implementato una proprietà di Autori che restituisce i relativi Libri non credo serva allo scopo.
In pratica, quello che vorrei fare è popolare una grid (di devexpress, un produttore terzo) in modo che mostri il nome di ciascun autore in ciascun nodo e i suoi libri espandendo il relativo nodo. Per far ciò, il controllo richiede necessariamente un datasource che contenga una relazione diretta, uno a molti, tra le due tabelle che implementano visivamente la relazione master - detail.
Tanto è vero che se popolo la grid con una semplice query del tipo - from a in Autori Select a - la grid si popola mostrando tutti gli autori come nodi e poi, in automatico, come detail, il relativo contenuto della table LibriAutori che, effettivamente, è in relazione uno a molti con la table Autori.
Pertanto, per popolare la grid non posso usare l'esempio che mi hai fornito che, invece, accede agli elementi iterando con due cicli for-each.
Boh? Che dici, lascio questo hobby e faccio l'avvocato a tempo pieno?? :)
Ciao e grazie comunque.
F.
Modificato da xinner il 15 gennaio 2009 01.27 -
Ma sei sicuro? Mi sembra strano, non conosco quella griglia, ma non è che da qualche parte devi specificare il percorso della relazione?

m.

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.