944 messaggi dal 11 febbraio 2013
ciao ragazzi
in una interrogazione in un progetto ottengo l'errore in oggetto:
Win32Exception (0x80004005): Tempo di attesa scaduto]

[SqlException (0x80131904): Timeout. Il tempo disponibile è scaduto prima del completamento dell'operazione o il server non risponde.]

la stessa interrogazione su sql procede senza problemi

in pratica filtro i dati e faccio una "pivot"

come filtri ho Anno, cliente, lineaprodotto,tipodati (ordini,fatture)

In particolare "sbarella" quando filtro solamente la linea

public IQueryable<OrdineMeseLineaView> GetOrdiniMeseLinea(IQueryable<DatabaseOrdiniAgente> database)
        {
        
            var modelView = database.
                            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;
        }

        public IQueryable<DatabaseOrdiniAgente> GetDataModel(string vCodiceAgente, OrdineMeseLineaSearchModel search)
        {
            var data = new List<DatabaseOrdiniAgente> { new DatabaseOrdiniAgente
                                                          {
                                                            Linea="", CodiceCliente="", Anno=0,  Mese=0, Importo=0
                                                          }}.AsQueryable();

            if(search.anno == null && search.cliente == null && search.linea == null )
            {
              //Modello resta vuoto
            }
            else
            {
                if(search.tipoDati == "Ordini")
                {
                   data = from ordine in db.TABELLAORDINI.AsNoTracking()
                           where ordine.RolCodage == vCodiceAgente
                               join rigaOrdine in db.TABELLARIGHEORDINI.AsNoTracking() on new
                               {
                                   ...CAMPI CHIAVE
                               }
                              equals new
                              {
                                  CAMPI CHIAVE
                              }
                           join articolo in db.ARTICOLI.AsNoTracking() on rigaOrdine.CodiceArticolo equals articolo.RanCodart
                           let linea = articolo.TipoProdotto == "XX001" ? "XX" :
                                       articolo.TipoProdotto == "YY002" ? "YY" :
                                       ... : "" 
                           select new DatabaseOrdiniAgente
                           {
                               Anno = ordine.Anno,
                               CodiceCliente = ordine.Codcli,
                               Linea = linea,
                               Mese = ordine.Data.Value.Month,
                               Importo = rigaOrdine.Importo
                           };

                    data = FilterData(data, search);
                   
                }
                else //Fatture
                {
                    // datamodel fattura
                    data = FilterData(data, search);
                }
            }

            return data;

        }

        private IQueryable<DatabaseOrdiniAgente> FilterData(IQueryable<DatabaseOrdiniAgente> data, OrdineMeseLineaSearchModel search)
        {
            if (search.anno != null)
                data = data.Where(i => i.Anno == search.anno);

            if (search.cliente != null)
                data = data.Where(i => i.CodiceCliente == search.cliente);

            if(search.linea != null)
            {
                List<string> distinzioniSelezionate = new List<string>();
                foreach (var item in search.linea)
                {
                    distinzioniSelezionate.Add(item);
                }
                data = data.Where(i => distinzioniSelezionate.Contains(i.Linea));
            }

            // Riduco le entità da interrogare sommando per Importo
            data = data.GroupBy(f => new
            {
                f.Anno,
                f.CodiceCliente,
                f.Linea,
                f.Mese
            }).Select(g => new DatabaseOrdiniAgente
                                          {
                                              Anno = g.Key.Anno,
                                              CodiceCliente = g.Key.CodiceCliente,
                                              Linea = g.Key.Linea,
                                              Mese = g.Key.Mese,
                                              Importo = g.Sum(x => x.Importo) 
                                          }).AsQueryable();

            return data;
        }
    }

Potete aiutarmi a capire come ottimizzare ?

grazie
Modificato da jjchuck il 27 giugno 2017 18.03 -
944 messaggi dal 11 febbraio 2013
Ho letto che bisogna evitare di usare Contains

cosi ho provato

data = from i in data
join x in distinzioniSelezionate on i.Linea equals x
select i;

tuttavia ottengo sempre l'errore

non capisco come risolvere

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.