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 -