Linq Sum e Group By
Impotizzando di avrere la segente tabella
e di voler calcolare la somma della quantità a parità di Anno, Mese e Articolo. In SQL scriveremmo una frase di questo tipo:
SELECT Anno, Mese, Articolo, SUM(Quantita) AS QuantitaTotale
FROM Magazzino
GROUP BY Anno, Mese, Articolo
In Linq To SQL la frase suggerita dalla documentazione (GroupBy – Sum) sarebbe:
Dim q = From m In db.Magazzinos _
Group m By m.Anno, m.Mese, m.Articolo Into g = Group _
Select New With {g, Anno, Mese, Articolo, .QuatitaTotale = g.Sum(Function(m) m.Quantita)}
Ipotizzando poi di avere nella tabella solo due record
ID | Anno | Mese | Articolo | Quantita |
1 | 2009 | 1 | 1 | 10 |
2 | 2009 | 2 | 2 | 20 |
e di eseguire un ciclo sui record selezionati del tipo
For Each m in q
…
Next
otteniamo che vengono generati i seguenti comandi SQL:
SELECT SUM([t0].[Quantita]) AS [QuatitaTotale], [t0].[Anno], [t0].[Mese], [t0].[Articolo]
FROM [dbo].[Magazzino] AS [t0]
GROUP BY [t0].[Anno], [t0].[Mese], [t0].[Articolo]
— Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 3.5.30729.1
SELECT [t0].[ID], [t0].[Anno], [t0].[Mese], [t0].[Articolo], [t0].[Quantita]
FROM [dbo].[Magazzino] AS [t0]
WHERE (@x1 = [t0].[Anno]) AND (@x2 = [t0].[Mese]) AND (@x3 = [t0].[Articolo])
— @x1: Input Int (Size = 0; Prec = 0; Scale = 0) [2009]
— @x2: Input Int (Size = 0; Prec = 0; Scale = 0) [1]
— @x3: Input Int (Size = 0; Prec = 0; Scale = 0) [1]
— Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 3.5.30729.1
SELECT [t0].[ID], [t0].[Anno], [t0].[Mese], [t0].[Articolo], [t0].[Quantita]
FROM [dbo].[Magazzino] AS [t0]
WHERE (@x1 = [t0].[Anno]) AND (@x2 = [t0].[Mese]) AND (@x3 = [t0].[Articolo])
— @x1: Input Int (Size = 0; Prec = 0; Scale = 0) [2009]
— @x2: Input Int (Size = 0; Prec = 0; Scale = 0) [2]
— @x3: Input Int (Size = 0; Prec = 0; Scale = 0) [2]
— Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 3.5.30729.1
Ovvero vengono creati dei comandi di selezione dopo il comando si somma e questo a causa della seguente:
Select New With {g, Anno, Mese, Articolo, .QuatitaTotale = g.Sum(Function(m) m.Quantita)}
Infatti scrivendo la seguente frase Linq:
Dim q = From m In db.Magazzinos _
Group m By m.Anno, m.Mese, m.Articolo Into g = Group _
Select Anno, Mese, Articolo, QuatitaTotale = g.Sum(Function(m) m.Quantita)
Verrà generato un solo comando SQL:
SELECT SUM([t0].[Quantita]) AS [QuatitaTotale], [t0].[Anno], [t0].[Mese], [t0].[Articolo]
FROM [dbo].[Magazzino] AS [t0]
GROUP BY [t0].[Anno], [t0].[Mese], [t0].[Articolo]
— Context: SqlProvider(Sql2008) Model: AttributedMetaModel Build: 3.5.30729.1