453 messaggi dal 11 febbraio 2013
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 -
453 messaggi dal 11 febbraio 2013
Ho tentato di risolvere con dynamic linq ma ho delle difficoltà con una proprietà anonima di tipo string:

non posso usare Proprietà.Contains(@2)

String where = string.Empty;
            object[] parameters = null;

            if (search.anno != null)
                where = " ANNO = @0 ";
              parameters = new object[] { search.anno };
             
            if (search.Cliente != null)
            {
                if (!string.IsNullOrEmpty(where))
                {
                    where += " && CODICE_CLIENTE = @1";
                    parameters = new object[] { search.anno, search.Cliente };
                }
                else
                {
                    where = " CODICE_CLIENTE = @0";
                    parameters = new object[] { search.Cliente };
                }
            }

            if (search.linea != null)
            {
                if (!string.IsNullOrEmpty(where))
                {
                    where += " && LINEA.Contains(@2) ";
                    parameters = new object[] { search.anno, search.Cliente, search.linea };
                }
                else
                {
                    where = " LINEA.Contains(@0) ";
                    parameters = new object[] { search.linea };
                }
            }

per favore potete darmi una mano?
Modificato da jjchuck il 09 aprile 2017 17.08 -

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.