Экспорт результатов поиска в Excel в ASP.NET MVC все-таки замедлилось все приложение
Я создаю образец приложения mvc. Я пытаюсь экспортировать результаты поиска в excel. Я сохранил Результаты поиска в сеансе и экспортировал этот список сеансов в excel. Он прекрасно работал, когда я играл с небольшой базой данных, которая имеет только 2000 строк. Теперь у меня в базе данных около 300 тысяч строк. Поиск результатов и экспорт в excel по-прежнему работают нормально. Но мое заявление резко замедлилось.
Когда я комментирую ниже код, мое приложение снова работает нормально, как только я раскомментирую его, оно замедлится.
//Session["SearchResults"] = aPPET.ToList<APPET>();
Как лучше всего это сделать, когда есть большая база данных?
Я читал сообщение о closedxml, но не совсем уверен, как его реализовать. Нужно ли мне создавать процедуру хранения, если я иду по этому маршруту? Или есть какой-то лучший способ.
Пожалуйста, предложите.
Ниже приведены мои коды контроллера:
Что я уже пробовал:
public class APPET1Controller : Controller { private APContext db = new APContext(); // GET: APPET1 public ActionResult Index(string search, string cagecode, string sortBy, int? page, string docNumber, string remark, string status) { APPETViewModel viewModel = new APPETViewModel(); var aPPET1 = db.APPET1.Include(t =>T.APPETMedia) .Include(t => t.Status) .Include(t => t.APPETCCode) .Include(t => t.APPETDType); ............some more codes.............. DateTime searchDate; if (!String.IsNullOrEmpty(search)) { bool isDateSearch = DateTime.TryParse(search, out searchDate); if (isDateSearch) { aPPET1 = aPPET1.Where(s => s.Date_Received == searchDate); } else { aPPET1 = aPPET1.Where(t.Doc_Number.Contains(search) || t.Status.Status1.Contains(search) || t.Remark.Contains(search) || t.CCode.Contains(search)); ..............some more codes.............. viewModel.Search = search; } } var stats = db.Status.Select(s => s.Status1); viewModel.Statuses = new SelectList(stats); { if (!String.IsNullOrEmpty(status)) { aPPET1 = aPPET1.Where(t => t.Status.Status1.Contains(status)); } } if (!String.IsNullOrEmpty(docNumber)) { aPPET1 = aPPET1.Where(t => t.Doc_Number.Contains(docNumber)); } if (!String.IsNullOrEmpty(remark)) { aPPET1 = aPPET1.Where(t => t.Remark.Contains(remark)); } ............some more codes......... Session["SearchResults"] = aPPET.ToList<APPET>(); return View(viewModel); } public ActionResult ExportToExcel() { var AppetList= (List<APPET1>)Session["SearchResults"]; var result = from r in AppetList select new { DocNumber = r.DocNum, Status = r.Status.Status1, Remark = r.Remark -----some more codes------ }; GridView gv = new GridView(); gv.DataSource = result.ToList(); gv.DataBind(); Response.ClearContent(); Response.Buffer = true; Response.AddHeader("content-disposition", "attachment; filename=TaciList.xls"); Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; Response.Charset = ""; StringWriter sw = new StringWriter(); HtmlTextWriter htw = new HtmlTextWriter(sw); gv.RenderControl(htw); Response.Output.Write(sw.ToString()); Response.Flush(); Response.End(); return RedirectToAction("Index");
F-ES Sitecore
Итак, вы хотите, чтобы мы помогли вам ускорить написание в Excel, когда вы не сказали нам, как вы пишете в Excel, и вы публикуете кусок кода, который не включает строку, с которой у вас есть проблема?
Regardless, writing that amount of data is always going to be slow. There are some things you could probably do to help, but it's never going to be fast. The fact that you are storing the data in a session implies you are getting the code in one action and saving to Excel in another. If that's so it's a bad idea. All that data just eats up memory, so have the page that writes to Excel access the data itself. Also if it's a lot of data don't use ToList to convert it to a list first, use IEnumerable to go through the data line by line. Again it's not going to make it "fast" but it's going to use less resources than ToList which is effectively forcing all of the data into memory in one go.
CHill60
ОП пытается ответить на ваш комментарий, но не получает понятия "ответить" :)
phatlee
@F-ES Sitecore, экспорт в excel-это нормально, как только он загружен. Загрузка и поиск занимают слишком много времени, когда я пытался сохранить его в сеансе. Итак, если мне нужно временно сохранить результат поиска, чтобы при необходимости экспортировать его в excel, как мне это сделать? Теперь я знаю, что не могу использовать сеанс. Извините, английский-мой второй язык, и я новичок в программировании, так что если вы не понимаете, я могу объяснить еще раз. пожалуйста, дайте мне знать. спасибо.
F-ES Sitecore
Вам нужно что-то вроде
по каждому элементу(ВАР результате в аппэт)
{
// экспорт результата в Excel
}