PDA

View Full Version : [.net]Databinding->Datagridview->GroupBy


RaouL_BennetH
17-09-2012, 00:43
salve :coffee:

ho la tipica situazione in cui:



private void BindGrid(int objID)
{
BindingSource bs = new BindingSource();
bs.DataSource = myView.GetDetail(objID);
myGrid.DataSource = bs;
}

private void SomeWhereInTheBlueCode()
{
BindGrid(11);
}



e ottengo ovviamente i dati correttamente sulla griglia...

Ora, avrei bisogno di fare in modo che in base ad un'azione da parte dell'utente, a questa griglia io possa aggiungere dei dati e raggrupparli, cioè:

se l'utente aggiunge "caramella rossa"
e nella griglia già è presente un'articolo "caramella rossa"
anzichè aggiungere una riga me ne sommi le quantità, ovvero:

caramella rossa -> 2

che mi aumenti quindi, soltanto le quantità.

E questa sarebbe la mia prima vista....

Successivamente dovrei poi essere in grado anche invece di "separarle" e quindi di vedere per ciascun dato, la singola quantità.

Per la singola quantità ovviamente non ho problemi.

Sono sempre su EF e ho libertà di scelta fra linq to sql e linq to entity.

Grasiiasisiaisiiaassse !!

RaouL_BennetH
18-09-2012, 00:18
Dopo un pò di arzigogolamenti ed un aiuto da msdn sono giunto qui:


public IQueryable ViewArticoliGrouped(int orderID)
{
var result = from order in context.Orders
join sellers in context.Sellers on order.id_order equals sellers.orderID
join articles in context.Articles on order.id_order equals articles.orderID
where order.id_order == orderID
group articles by articles.ArticoliTop.descrizione into TEST_GROUP
let unitPrice = TEST_GROUP.FirstOrDefault().prezzo
let qty = TEST_GROUP.Sum(s => s.quantita)
let priority = TEST_GROUP.FirstOrDefault().portata
let send = TEST_GROUP.FirstOrDefault().inviata
let idr = TEST.FirstOrDefault().id_articolo
select new
{
seller = TEST_GROUP.FirstOrDefault().Orders.Sellers.FirstOrDefault().denominazione,
prodotto = TEST_GROUP.Key,
prezzo = unitPrice * qty,
quantity = qty,
priority = priority,
inviato = send,
idr = idr
};
return result;
}


Avrei due domande:

1) è lentissima :( come mai ?

2) volendo 'tradurla' in linq to entity, mi dareste una mano ?

Raoul....

Kralizek
20-09-2012, 11:35
il problema sono tutti quei FirstOrDefault() :eek:

seller = TEST_GROUP.FirstOrDefault().Orders.Sellers.FirstOrDefault().denominazione
per qualcosa del genere una volta ho cancellato l'intero metodo ad un tirocinante e gliel'ho fatto riscrivere. :sofico: (credo che il tirocinante ha pensato di denunciarmi per mobbing, questi svedesi!)

invece di fare una singola query L2Sql, perché non fai diverse query, metti il risultato in collezioni che ti possono aiutare e poi combini il tutto in L2Objects?

se proprio non riesci a decomporre efficientemente la query, prova ad aiutarti con delle view fatte ad hoc sul database. per quanto lo si voglia far credere, utilizzarle in un ORM non é una bestemmia ;) l'importante é non provare a scriverci dentro ;) *


* in realtá con il giusto set di trigger puoi scrivere anche in una view

RaouL_BennetH
22-09-2012, 07:17
il problema sono tutti quei FirstOrDefault() :eek:

seller = TEST_GROUP.FirstOrDefault().Orders.Sellers.FirstOrDefault().denominazione
per qualcosa del genere una volta ho cancellato l'intero metodo ad un tirocinante e gliel'ho fatto riscrivere. :sofico: (credo che il tirocinante ha pensato di denunciarmi per mobbing, questi svedesi!)

invece di fare una singola query L2Sql, perché non fai diverse query, metti il risultato in collezioni che ti possono aiutare e poi combini il tutto in L2Objects?

se proprio non riesci a decomporre efficientemente la query, prova ad aiutarti con delle view fatte ad hoc sul database. per quanto lo si voglia far credere, utilizzarle in un ORM non é una bestemmia ;) l'importante é non provare a scriverci dentro ;) *


* in realtá con il giusto set di trigger puoi scrivere anche in una view

Ok, provo a frammentare allora !

Per quanto riguarda le view, a me sembrava la via più semplice ma non posso
agire sul database e ad una piccola richiesta da parte mia hanno storto il naso.

Mille grazie :)

RaouL_BennetH
22-09-2012, 21:46
Allora... Ho provato a riprodurmi su un db in locale le tabelle e crearmi una vista.

E' tremendamente più veloce.

Ad ogni modo ho comunque due problemi:

1) Non potrò mai usarla perchè non ne ho l'autorizzazione

2) Ci sono dei dati che vorrei capire come visualizzare:


Tabella Ordini:
id_ordine pk
altreInfoPocoUtili...

TabellaAssegnazioneVenditori
id_assignment pk
regioneID (fk -> pk tabella regioni (id_regione))
ordineID (fk -> pk tabella ordini (id_ordine))

TabellaArticoliVenduti
id_vendita pk
articoloID (fk -> pk tabella articoli(id_articolo))
ordineID (fk -> pk tabella ordini(id_ordine))
qta (intero)
prezzo(decimal)
priority (intero)
evaso (bit)



Nella view non riesco ad inserire:
La regione o l'id della stessa (dato che non dev'essere raggruppata)
la priorità (anch'essa non ha un raggruppamento)
e lo stato dell'articolo (se è stato evaso o meno)

In pratica:

SELECT dbo.ArticoliVenduti.articoloID, dbo.Ordini.id_ordine AS pID, SUM(dbo.ArticoliVenduti.quantita) AS Qta,
SUM(dbo.ArticoliVenduti.prezzo * dbo.ArticoliVenduti.quantita) AS price
FROM dbo.ArticoliVenduti INNER JOIN
dbo.Ordini ON dbo.ArticoliVenduti.orderID = dbo.Ordini.id_ordine INNER JOIN
dbo.AssegnazioneVenditori ON dbo.Ordini.id_ordine = dbo.AssegnazioneVenditori.ordineID
GROUP BY dbo.Ordini.id_ordine, dbo.ArticoliVenduti.articoloID


Ciò che mi restituisce è corretto ma è incompleto..

DarkSiDE
26-09-2012, 11:02
potrebbe sfuggirmi qualcosa, ma non capisco il problema

la query è corretta, devi solo aggiungere regione, stato e priorità e raggruppare cmq per gli stessi poichè non sono usati dalla funzione di aggregazione.

Diversamente, non ho capito cosa vuoi ottenere