L oop over IEnumerable <T>выдает исключение Not Supported - PullRequest
0 голосов
/ 10 марта 2020

Мне нужен запрос, который возвращает только некоторые элементы списков, и мне нужно поместить эти элементы в базу данных.

Это запрос linq, который возвращает 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 };

Затем я хочу перебрать этот 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 to Entities. "

Почему она генерирует эту ошибку?

EDIT: Сообщается о строке, когда исключение перехватывается

Большое спасибо.

1 Ответ

1 голос
/ 10 марта 2020

Похоже, что вы подготовили только запрос LINQ, но он еще не выполнен в базе данных и, следовательно, нет данных в вашей коллекции IEnumerable.

Возможно, вы захотите выполнить targheOK.AsEnumerable() вызов метода перед циклом, чтобы записи сбрасываются в память, и вы можете l oop через строки.

...