Я получаю ошибку анонимного типа при попытке извлечь данные из БД в файл Excel в ASP.NET MVC & C # - PullRequest
0 голосов
/ 27 сентября 2019

Я использую Entity Framework и C # & ASP.NET MVC для извлечения данных из таблицы и загрузки их в файл Excel.Загрузка загружает только одну запись несколько раз, когда я использую первую или по умолчанию, поэтому я изменил свой код для выбора нужных столбцов, но я получаю сообщение об ошибке: ошибка возникает в элементе (0), и я думаю, что этостроковый метод.

LINQ to Entities не распознает метод '<> f__AnonymousType5 7[System.Int32,System.String,System.String,System.String,System.String,System.Nullable 1 [System.DateTime], System.Nullable 1[System.Int32]] ElementAt[<>f__AnonymousType5 7] (System.Linq.IQueryable 1[<>f__AnonymousType5 7 [System.Int32, System.String, System.String, System.String, System.String, System.Nullable 1[System.DateTime],System.Nullable 1 [System.Int32]]], Int32) ', и этот метод не может быть переведенв выражение магазина.

Мой контроллер

namespace App.Web.Controllers
{
    public class ExportToExcelController : Controller
    {
        private MarketingDBEntitiesModel db = new MarketingDBEntitiesModel();

        public ActionResult ExportToExcel(int UploadId)
        {
                  select c);

            UploadId = 4;
            var dataToExport = db.marketingdbclients_invalidEmails
               .Join(db.marketingdbclients_dataTable
               , od => od.ClientId
               , o => o.ClientId
               , (o, od) => new {
                   o.ClientId,
                   o.Email1,
                   o.Email2,
                   o.Email3,
                   o.Email4,
                   o.DateStamp, 
                   od.UploadId
               }).Where(a=> a.UploadId == UploadId)  
                .Select(s => s);

            ExcelPackage excel = new ExcelPackage();
            var workSheet = excel.Workbook.Worksheets.Add("Sheet1");
            workSheet.TabColor = System.Drawing.Color.Black;
            workSheet.DefaultRowHeight = 12;
            //Header of table  
            //  
            workSheet.Row(1).Height = 20;
            workSheet.Row(1).Style.HorizontalAlignment = ExcelHorizontalAlignment.Center;
            workSheet.Row(1).Style.Font.Bold = true;
            workSheet.Cells[1, 1].Value = dataToExport.ElementAt(0);
            workSheet.Cells[1, 2].Value = dataToExport.ElementAt(1);
            workSheet.Cells[1, 3].Value = dataToExport.ElementAt(2);
            workSheet.Cells[1, 4].Value = dataToExport.ElementAt(3);
            workSheet.Cells[1, 5].Value = dataToExport.ElementAt(4);
            workSheet.Cells[1, 6].Value = dataToExport.ElementAt(5);

            //workSheet.Cells[1, 2].Value = dataToExport.Email1;
            //workSheet.Cells[1, 3].Value = dataToExport.Email2;
            //workSheet.Cells[1, 4].Value = dataToExport.Email3;
            //workSheet.Cells[1, 5].Value = dataToExport.Email4;
            //workSheet.Cells[1, 6].Value = dataToExport.DateStamp;

            // Body of table  
            int recordIndex = 2;

            foreach (var exportData in dataToExport.ToString())
            {
                workSheet.Cells[recordIndex, 1].Value = (recordIndex - 1).ToString();
                workSheet.Cells[recordIndex, 2].Value = dataToExport.ElementAt(0);
                workSheet.Cells[recordIndex, 3].Value = dataToExport.ElementAt(1);
                workSheet.Cells[recordIndex, 4].Value = dataToExport.ElementAt(2);
                workSheet.Cells[recordIndex, 5].Value = dataToExport.ElementAt(3);
                workSheet.Cells[recordIndex, 6].Value = dataToExport.ElementAt(4);
                workSheet.Cells[recordIndex, 7].Value = dataToExport.ElementAt(5);
                workSheet.Cells[recordIndex, 8].Value = dataToExport.ElementAt(6);

                //workSheet.Cells[recordIndex, 2].Value = dataToExport.ClientId;
                //workSheet.Cells[recordIndex, 3].Value = dataToExport.Email1;
                //workSheet.Cells[recordIndex, 4].Value = dataToExport.Email2;
                //workSheet.Cells[recordIndex, 5].Value = dataToExport.Email3;
                //workSheet.Cells[recordIndex, 6].Value = dataToExport.Email4;
                //workSheet.Cells[recordIndex, 7].Value = dataToExport.DateStamp;
                //workSheet.Cells[recordIndex, 8].Value = dataToExport.ClientId;
                recordIndex++;
            }

            workSheet.Column(1).AutoFit();
            workSheet.Column(2).AutoFit();
            workSheet.Column(3).AutoFit();
            workSheet.Column(4).AutoFit();
            workSheet.Column(5).AutoFit();
            workSheet.Column(6).AutoFit();
            workSheet.Column(7).AutoFit();
            string excelName = "invalidEmailRecord";

            using (var memoryStream = new MemoryStream())
            {
                Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
                Response.AddHeader("content-disposition", "attachment; filename=" + excelName + ".xlsx");
                excel.SaveAs(memoryStream);
                memoryStream.WriteTo(Response.OutputStream);
                Response.Flush();
                Response.End();

                return View();
            }
        }
    }
}

1 Ответ

0 голосов
/ 28 сентября 2019

Вы делаете for на dataToExport.ToString()?Вызов перечисления (например, for) для string просто даст вам массив char s.Вероятно, это выглядело бы примерно так (вывод через запятую):

S, y, s, t, e, m, ., L, i, n, q, ., E, n, u, m, e, r, a, b, l, e, +, W, h, e, r, e, S, e, l, e, c, t, E, n, u, m, e, r, a, b, l, e, I, t, e, r, a, t, o, r, `, 2, [, <, >, f, _, _, A, n, o, n, y, m, o, u, s, T, y, p, e, 0, `, 3, [, S, y, s, t, e, m, ., I, n, t, 3, 2, ,, S, y, s, t, e, m, ., S, t, r, i, n, g, ,, S, y, s, t, e, m, ., S, t, r, i, n, g, ], ,, <, >, f, _, _, A, n, o, n, y, m, o, u, s, T, y, p, e, 0, `, 3, [, S, y, s, t, e, m, ., I, n, t, 3, 2, ,, S, y, s, t, e, m, ., S, t, r, i, n, g, ,, S, y, s, t, e, m, ., S, t, r, i, n, g, ], ]

Я думаю, что вы ищете:

foreach (var exportData in dataToExport)
{
    workSheet.Cells[recordIndex, 2].Value = exportData.ClientId;
    workSheet.Cells[recordIndex, 3].Value = exportData.Email1;
    workSheet.Cells[recordIndex, 4].Value = exportData.Email2;
    workSheet.Cells[recordIndex, 5].Value = exportData.Email3;
    workSheet.Cells[recordIndex, 6].Value = exportData.Email4;
    workSheet.Cells[recordIndex, 7].Value = exportData.DateStamp;
    workSheet.Cells[recordIndex, 8].Value = exportData.ClientId;

    //Move to the next row
    recordIndex++
}

Это приведет к тому, что выражение LINQ будет оценено и даст ваммассив анонимных объектов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...