Linq Sum e Group By

Impotizzando di avrere la segente tabella

image

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