Ciao,
per prima cosa, la strumentazione: dovresti scaricare ed usare
LINQPad, che ti dà l'opportunità di provare le tue query in tempo reale. E' un ottimo strumento non solo per chi inizia ma per chi chiunque debba scrivere query un pelo complesse.
Comincia a costruire la tua query LINQ poco alla volta, partendo da una sola tabella (ma sarebbe più corretto dire
set di entità, perché con LINQ interroghi il modello concettuale) e poi coinvolgendo le altre.
Il primo errore da evitare in una query come la tua è quello di usare i JOIN.
In LINQ to Entities non si usano i Join, ma le proprietà di navigazione.
Quindi prima di iniziare a scrivere la query, leggi questi articoli (uno te lo avevo già inviato, assicurati di averlo compreso a fondo).
http://coding.abel.nu/2012/06/dont-use-linqs-join-navigate/https://www.youtube.com/watch?v=4Ir4EIqxYXQhttps://msdn.microsoft.com/en-us/library/vstudio/bb896321%28v=vs.100%29.aspx?f=255&MSPPError=-2147217396Quindi, vedendo che la tua query relaziona movimenti a comuni e tipi gruppo, dovrai creare altrettante proprietà di navigazione chiamate, ad esempio, Comuni e TipoGruppo nella tua entità Movimento.
A questo punto puoi iniziare a scrivere la tua query LINQ. Vedo che c'è una UNION, quindi di fatto dovrai scrivere
due query LINQ ed unirle con il concat. Esempio:
var query1 = ....;
var query2 = ....;
var risultato = query1.Concat(query2);
//Qui assegni risultato al DataSource del controllo
Provo a scrivere giusto la prima query, ovvero quella che è alla sinistra della UNION ALL. Probabilmente ci saranno errori, ma serve a darti un'idea.
var data1 = DateTime.Today.AddDays(-1);
var data1 = DateTime.Today;
var idStruttura = 1;
var query1 = from movimento in ctx.Movimenti
where movimento.IdStruttura = idStruttura && movimento.arrivo >= data1 && movimento.arrivo <= data2
group movimento by new { movimento.IdStruttura, Comune = movimento.Comuni.Descrizione, movimento.IdTipoGruppo, TipoGruppo = movimento.TipoGruppo.Descrizione, movimento.Arrivo, TipoComune = movimento.Comuni.Tipo } into gruppo
select new { gruppo.Key.IdStruttura, gruppo.Key.Comune, gruppo,Key.IdTipoGruppo, gruppo.Key.TipoGruppo, data = gruppo.Key.Arrivo, stato = "ARRIVO", nmovimenti = gruppo.Count() };
Il risultato sarà un tipo anonimo, composto dalle sole proprietà coinvolte nella select. Usare i tipi anonimi è utile soprattuto quando non devi lavorare ulteriormente con il risultato, ma vuoi semplicemente visualizzarlo a schermo come nel tuo caso.
ciao,
Moreno
Modificato da BrightSoul il 05 marzo 2015 07.59 -