Ciao a tutti
in un progetto voglio "pivotare" gli ordini per mese
Per far questo metto in join testate ordini con dettaglio ordini e con prodotti.
Ottenuta questa lista la passo ad un metodo che poi raggruppa per mese.
L'esecuzione è troppo lunga (circa un minuto ...dipende dai filtri)
public IQueryable<DatabaseOrdiniAgente> GetData(string vCodiceAgente)
{
var data = (from ordine in db.ORDINI.AsNoTracking()
where ordine.Codage == vCodiceAgente
join rigaOrdine in db.DETTAGLIO.AsNoTracking() on new
{
ANNO = ordine.Anno,
NUMORD = ordine.Numord
}
equals new
{
ANNO = rigaOrdine.Anno,
NUMORD = rigaOrdine.Numord
}
join articolo in db.PRODOTTO.AsNoTracking() on rigaOrdine.Codart equals articolo.Codart
let linea = articolo.ProductLine == "ZX001" ? "ZX" :
...
articolo.ProductLine == "YT001" ? "YT" : "???"
select new
{
ANNO = ordine.Anno,
LINEA = linea,
MESE = ordine.Datord.Value.Month,
CODICE_CLIENTE = ordine.Codcli,
IMPORTO = rigaOrdine.Import
}).
GroupBy(f => new
{
f.ANNO,
f.CODICE_CLIENTE,
f.LINEA,
f.MESE
}).
Select(g => new DatabaseOrdiniAgente
{
Anno = g.Key.ANNO,
CodiceCliente = g.Key.CODICE_CLIENTE,
Mese = g.Key.MESE,
Linea = g.Key.LINEA,
Importo = g.Sum(x => x.IMPORTO)
}).AsQueryable();
//db.Database.Log = query => File.AppendAllText(System.Web.HttpContext.Current.Server.MapPath("/App_Data/querylog.txt"), query);
return data;
}
public IQueryable<OrdineMeseLineaView> GetOrdiniMeseLineaAgente(OrdineMeseLineaSearchModel search, IQueryable<DatabaseOrdiniAgente> database )
{
var model = database;
if (search.anno != null)
model = model.Where(i => i.Anno == search.anno);
if (search.Cliente != null)
model = model.Where(i => i.CodiceCliente == search.Cliente);
if(search.linea!=null)
{
List<string> lineaSelezionate = new List<string>();
foreach (var item in search.linea)
{
lineaSelezionate.Add(item);
}
model = model.Where(i => lineaSelezionate.Contains(i.Linea));
}
var modelView = model.
GroupBy(r => r.Linea).
Select(g => new OrdineMeseLineaView
{
Linea = g.Key.ToString(),
Gen = g.Where(r => r.Mese == 1).Sum(r => r.Importo),
Feb = g.Where(r => r.Mese == 2).Sum(r => r.Importo),
Mar = g.Where(r => r.Mese == 3).Sum(r => r.Importo),
Apr = g.Where(r => r.Mese == 4).Sum(r => r.Importo),
Mag = g.Where(r => r.Mese == 5).Sum(r => r.Importo),
Giu = g.Where(r => r.Mese == 6).Sum(r => r.Importo),
Lug = g.Where(r => r.Mese == 7).Sum(r => r.Importo),
Ago = g.Where(r => r.Mese == 8).Sum(r => r.Importo),
Set = g.Where(r => r.Mese == 9).Sum(r => r.Importo),
Ott = g.Where(r => r.Mese == 10).Sum(r => r.Importo),
Nov = g.Where(r => r.Mese == 11).Sum(r => r.Importo),
Dic = g.Where(r => r.Mese == 12).Sum(r => r.Importo),
Tot = g.Sum(r => r.Importo)
});
return modelView;
}
}
Ho loggato la query e ho visto che esegue 12 volte qualcosa di questo tipo
SELECT
SUM([GroupBy21].[A1]) AS [A1]
FROM ( SELECT
[Project21].[Anno] AS [K1],
[Project21].[Codcli] AS [K2],
[Project21].[C1] AS [K3],
[Project21].[C2] AS [K4],
SUM([Project21].[RoaImport]) AS [A1]
FROM ( SELECT
[Extent31].[Anno] AS [Anno],
[Extent31].[Codcli] AS [Codcli],
[Extent32].[Import] AS [Import],
CASE WHEN ('XZ001' = [Extent33].[linea]) THEN N'XZ' ... ELSE N'???' END AS [C1],
DATEPART (month, [Extent31].[Datord]) AS [C2]
FROM [dbo].[ORDINI] AS [Extent31]
INNER JOIN [dbo].[DETTAGLIO] AS [Extent32] ON ([Extent31].[Anno] = [Extent32].[Anno]) ECCETERA____
INNER JOIN [dbo].[PRODOTTO] AS [Extent33] ON [Extent32].[Codart] = [Extent33].[Codart]
WHERE (1 = (DATEPART (month, [Extent31].[Datord]))) AND (([Extent31].[Codage] = @p__linq__0) OR (([Extent31].[Codage] IS NULL) AND (@p__linq__0 IS NULL)))
) AS [Project21]
GROUP BY [Project21].[Anno], [Project21].[Codcli], [Project21].[C1], [Project21].[C2]
) AS [GroupBy21]
WHERE ( CAST( [GroupBy21].[K1] AS int) = @p__linq__1) AND (([Project20].[C2] = [GroupBy21].[K3]) OR (([Project20].[C2] IS NULL) AND ([GroupBy21].[K3] IS NULL)))
Gli unici filtri sono ANNO-CODICE_CLIENTE-LINEA -CODICE AGENTE (PASSATO DAL METODO)
Ho tentato di rieseguire la query sul database ma non so come dichiarare le variabili
@p__linq__0
@p__linq__1
Avete qualche suggerimento ?
Modificato da jjchuck il 05 aprile 2017 14.32 -