i need a query that returns only some items of a lists and i need to put these items into a database.
This is the linq query that returns an IEnumerable:
IEnumerable<VerificaParcheggio> targheOK = from c in verifica
join d in db.Net_Veicoli_Targhe
on c.Targa equals d.Targa
join tt in db.BT_Titoli_Targhe
on new { idVeicolo = d.IDVeicolo, DataTroncata = DbFunctions.TruncateTime(c.DataUscita) } equals new { idVeicolo = tt.IDVeicolo, DataTroncata = DbFunctions.TruncateTime(tt.Scadenza) }
join td in db.BT_Titoli_Dettagli
on new { tt.IDTitolo, c.IDParcheggio } equals new { td.IDTitolo, IDParcheggio = td.IDGCPark == null ? 0 : td.IDGCPark.Value }
where tt.Attiva
&& ((td.Validita == 1 && c.DataUscita.Hour <= 13) || (td.Validita == 2 && c.DataUscita.Hour > 13))
select new VerificaParcheggio() { IDParcheggio = c.IDParcheggio, DataUscita = c.DataUscita, Targa = c.Targa };
Then i want to iterate through this IEnumerable because i need to take some data from the database that i need to put into the table that i'm going to populate:
using (var transaction = db.Database.BeginTransaction())
{
try
{
foreach (VerificaParcheggio v in targheOK) /*THIS LINE THROW THE EXCEPTION*/
{
BT_Verifica_Parcheggi verificaPa = (from c in db.BT_Verifica_Parcheggi
where c.idParcheggio == v.IDParcheggio &&
c.Targa == v.Targa &&
c.DataUscita == v.DataUscita
select c).FirstOrDefault();
decimal idVeicolo = (from c in db.Net_Veicoli_Targhe
where c.Targa == v.Targa
orderby c.DataOraInserimento descending
select c.IDVeicolo).FirstOrDefault();
DatiComproprietarioVeicolo datiComproprietarioVeicolo = TitolariVeicoli.GetProprietarioPrincipaleVeicolo(idVeicolo);
decimal idAnagrafica = (from c in db.Net_Soggetti_Anagrafica
where c.CodiceFiscale == datiComproprietarioVeicolo.codFiscale
select c.IDAnagrafica).FirstOrDefault();
BT_Verifica_Parcheggi_KO parcheggi = new BT_Verifica_Parcheggi_KO
{
IDVerifica = verificaPa.IDVerifica,
idAnagrafica = idAnagrafica,
Esito = false
};
db.BT_Verifica_Parcheggi_KO.Add(parcheggi);
}
db.SaveChanges();
transaction.Commit();
catch (Exception ex)
{
transaction.Rollback();
throw (ex);
}
}
when i reach the foreach statement the program starts to iterate and after about 50 seconds it catch an exception saying this
"This function can only be invoked from LINQ to Entities."
Why it's generating this error?
EDIT: Reported the line when the exception is catch
Thanks a lot.