我需要一个仅返回列表中某些项的查询,并且需要将这些项放入数据库中。
这是返回IEnumerable的linq查询:
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 };
然后,我想遍历此IEnumerable,因为我需要从数据库中提取一些需要放入到要填充的表中的数据:
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);
}
}
当我到达foreach语句时,程序开始进行迭代,并且在大约50秒后,它捕获到一个异常,说明这一点
“只能从LINQ到Entities调用此函数。”
为什么会产生此错误?
编辑:在捕获到异常时报告该行
非常感谢。
答案 0 :(得分:1)
看起来您只准备了LINQ查询,但是尚未在数据库上执行,因此IEnumerable集合上没有数据。
您可能希望在循环之前执行targheOK.AsEnumerable()
方法调用,以便将记录转储到内存中并可以循环浏览行。