Linq group e join

di il
6 risposte

Linq group e join

Salve,
devo incrociare delle tabelle
utilizzo il join ma poi successivamente non riesco a selezionare
i dati di tutte le tabelle se effettuo il raggruppamento.


var result = from p in Products                         
 join bp in BaseProducts on p.BaseProductId equals bp.Id                    
 group p by p.SomeId into pg                         
 select new ProductPriceMinMax { 
       SomeId = pg.FirstOrDefault().SomeId, 
       CountryCode = pg.FirstOrDefault().CountryCode, 
       MinPrice = pg.Min(m => m.Price), 
       MaxPrice = pg.Max(m => m.Price),
       BaseProductName = bp.Name  <------ can't use bp. 
 };
 


Mi date qualche informazione su come fare.

6 Risposte

  • Re: Linq group e join

    Nella tua espressione hai unito dati da due origini, poi hai effettuato un raggruppamento (group...by), quindi tutte le operazioni successive devono lavorare con i gruppi che hai creato, e non avrebbe senso usare l'identificatore bp dato che non è chiaro quale valore ci andrebbe a finire dentro, per via del raggruppamento stesso.

    Spiega meglio come sono fatti gli oggetti con cui stai lavorando e qual è l'informazione finale che devi estrarre, così proviamo a stendere un'espressione LINQ che faccia quanto richiesto.

    Ciao!
  • Re: Linq group e join

    Ti faccio un altro esempio:

    Ho due tabelle

    Fattura:
    Id|NumeroCliente |Fattura | Periodo|Importo | Scadenza

    Cliente:

    id|NumeroCliente | Nome| Cognome| Telefono|

    
    from a in Fattura
    join a1 in Cliente on a.NumeroCliente equals a1.NumeroCliente
    join a1 in Cliente on a.id equals a1.id
    group a by new { a.Id, a.NumeroCliente } into g
    select new{
    					   g.Key.Id,
                                               g.Key.NumeroCliente,
                                               Periodo= g.Count(),
                                               ORA SE VOGLIO PORTARMI I DATI DALLA TABELLA CLIENTE?
                                               AD ESEMPIO NOME?
                                               AD ESEMPIO COGNOME?
                                               AD ESEMPIO telefono?
    
    
    Spero di essere stato chiaro.
    Saluti
  • Re: Linq group e join

    koko ha scritto:


    Ti faccio un altro esempio
    [...]
    La struttura delle tabelle è chiara, ma non l'espressione che hai indicato.

    Innanzitutto, contiene due join che non capisco bene a cosa servano, tra l'altro con lo stesso identificatore:
    
    join a1 in Cliente on a.NumeroCliente equals a1.NumeroCliente
    join a1 in Cliente on a.id equals a1.id
    
    I dati chiedi di riportare, ossia questi
    
                                               ORA SE VOGLIO PORTARMI I DATI DALLA TABELLA CLIENTE?
                                               AD ESEMPIO NOME?
                                               AD ESEMPIO COGNOME?
                                               AD ESEMPIO telefono?
    
    dipendono da quello che vuoi estrarre dal raggruppamento: ad esempio, questi dati appartengono agli N oggetti del gruppo, oppure fanno parte della testata principale del tuo raggruppamento?

    Spiega esattamente che dato vuoi estrarre: il numero delle fatture per ogni cliente assieme ai dati del cliente? Tutte le fatture dello stesso cliente o raggruppate per cliente?

    Spiegalo in modo discorsivo e non con un'espressione LINQ poiché, se l'espressione è errata (altrimenti avremmo risolto il problema) si continua a non capire l'obiettivo finale.
  • Re: Linq group e join

    Ok,
    innanzitutto l'ID e il NumeroClienti Sono le chiavi per incrociare le due tabelle.
    Poi successivamente devo raggruppare per id e NumeroClienti
    (l'iD non è ricorsivo ma mi serve per individuare il cliente che ha un codice formato da id + numeroclienti)

    Raggruppo per ID e NumeroClienti
    Quindi voglio estrarre le fatture del singolo cliente ( quindi devo avere una riga per cliente).

    Praticamente:

    Id|NumeroCliente |Importo |Nome| Cognome| Telefono

    Spero di essere stato chiaro.
    Grazie
  • Re: Linq group e join

    koko ha scritto:


    innanzitutto l'ID e il NumeroClienti Sono le chiavi per incrociare le due tabelle.
    E fino a qui potremmo esserci, anche se non è chiaro il motivo per cui vi sono due chiavi al posto di una sola per correlare le due tabelle.

    koko ha scritto:


    Poi successivamente devo raggruppare per id e NumeroClienti
    Se raggruppi per i campi che hai detto, troverai N gruppi ciascuno per ogni cliente che contiene al suo interno N fatture che sono quelle del cliente. Questo è corretto?

    koko ha scritto:


    (l'iD non è ricorsivo ma mi serve per individuare il cliente che ha un codice formato da id + numeroclienti)
    Forse volevi dire che non è univoco, non ricorsivo.

    koko ha scritto:


    Raggruppo per ID e NumeroClienti
    Quindi voglio estrarre le fatture del singolo cliente ( quindi devo avere una riga per cliente).
    Questo vuol dire che ciascuna riga riporterà i dati del cliente, mentre per le fatture potrai avere solo degli "aggregati", altrimenti le righe diventeranno N*N (ossia N clienti per N fatture).

    koko ha scritto:


    Praticamente:
    Id|NumeroCliente |Importo |Nome| Cognome| Telefono
    Spero di essere stato chiaro.
    Diciamo di no, perché continui a parlare del procedimento, che abbiamo assodato essere probabilmente errato, mentre non ti limiti a dire quello che vorresti.

    Ad esempio, dalle colonne che hai indicato sopra nel tuo messaggio, se dici di volere una riga per cliente, la colonna dell'importo dovrà contenere una somma, mentre gli altri campi sono quelli del cliente che vanno riportati una volta sola nei risultati, altrimenti non avrai (così come chiedi) una riga per cliente.

    Se tu dicessi "voglio avere l'elenco di tutti i clienti e per ciascuno la somma degli importi delle fatture correlate a esso" (per fare un esempio), la finalità sarebbe ben comprensibile, e l'espressione verrebbe di conseguenza.

    Ad ogni modo, provo a tenere conto di ciò che ho capito io e ti propongo questa espressione, così vediamo se almeno ci avviciniamo:
    [CODE] var query = from a in Fattura join c in Cliente on new { a.Id, a.NumeroCliente } equals new { c.Id, c.NumeroCliente } group new { DatiCliente = c, DatiFattura = a } by new { a.Id, a.NumeroCliente } into g select new { Id = g.Key.Id, NumeroCliente = g.Key.NumeroCliente, Nome = g.First().DatiCliente.Nome, Cognome = g.First().DatiCliente.Cognome, Telefono = g.First().DatiCliente.Telefono, Importo = g.Sum(o => o.DatiFattura.Importo), ConteggioFatture = g.Count() }; Ciao!
  • Re: Linq group e join

    Grazie Mille.
    Era quello che cercavo.
    Saluti
Devi accedere o registrarti per scrivere nel forum
6 risposte