2016-06-22 3 views
0

처음부터 거짓 질문에 사과하고 싶습니다. 나는 MVC가 처음이다.데이터베이스에서 많은 양의 데이터를 pagedList에로드하십시오.

데이터베이스에서 모든 레코드를로드하려고 할 때 인덱스 페이지에서 대기 작업 시간이 초과되었습니다.

검색 필드와 명확한 선택 기능이있는 PagedList를 사용하고 있습니다. 내가 그것을 구현할 수 있도록 PagedList 내가 별도의 뷰 모델을 만들어 사용해야하기 때문에 인덱스 페이지에 대한이

public class BulbBatch 
{ 
    public int BulbBatchID { get; set; } 
    [Required] 
    public int DeliveryID { get; set; } 
    public virtual Delivery Delivery { get; set; } 
    [Required] 
    public int BulbsAmount { get; set; } 
    public int? BoxesAmount { get; set; } 
    [DataType(DataType.Date)] 
    public DateTime? CoolingDate { get; set; } 
    public int? BatchLocationID { get; set; } 
    public virtual Location Location { get; set; } 
    public string Comments { get; set; } 
    public string BulbBatchBarCode { get; set; } 
    public byte[] BulbBatchBarCodeImage { get; set; } 
    public string BulbBatchImageURL { get; set; } 
} 

내 뷰 모델이

public class BulbBatchViewModel 
{ 
    public int BulbBatchID { get; set; } 
    [DisplayName("Bulb Type Name")] 
    public string BulbTypeName { get; set; } 
    [DisplayName("Bulbs Amount")] 
    public int BulbsAmount { get; set; } 
    [DisplayName("Location Name")] 
    public string LocationName { get; set; } 
} 

다음처럼

내 도메인 모델 보인다. PagedList를 사용하는 ;

public class BulbBatchListViewModel 
{ 
    public int? Page { get; set; } 
    /// <summary> 
    /// fields for searching 
    /// </summary> 
    public string BulbName { get; set; } 
    public string BarCode { get; set; } 
    public string LocationName { get; set; } 
    /// <summary> 
    /// using IPageList instead of IEnumerable to create pagination on the view 
    /// </summary> 
    public IPagedList<BulbBatchViewModel> SearchResult { get; set; } 
    public string SearchButton { get; set; } 
    public string ClearButton { get; set; } 
} 

그리고 마침내 나는 데이터베이스에서 데이터를 검색하고 내 BulbBatchesListViewModel를 초기화하는 내 컨트롤러 내부의 작업 결과 색인 방법이있다. 나는 여러 데이터베이스

public ActionResult Index(BulbBatchListViewModel model) 
{ 
     db.Configuration.ProxyCreationEnabled = false; 
     // creating list with My viewModel for one item of BulbBatc because I need to replace indexes and add extra data from related tables 
     List<BulbBatchViewModel> batchesListVM = new List<BulbBatchViewModel>(); 
     IQueryable<BulbBatch> results; 
     string barcode = ""; 
     if (!string.IsNullOrEmpty(model.BarCode) || model.Page.HasValue) 
      barcode = '*' + model.BarCode + '*'; 
     if (!string.IsNullOrEmpty(model.SearchButton) || model.Page.HasValue) 
     { 
      //get all records from database based upon filters     
      results = db.BulbBatches.Include(d => d.Delivery).Include(t => t.Delivery.BulbType).Where(b => 
                    (b.BulbBatchBarCode.Equals(model.BarCode) || string.IsNullOrEmpty(model.BarCode)) && 
                    (b.Delivery.BulbType.BulbName.ToLower().Equals(model.BulbName) || string.IsNullOrEmpty((model.BulbName))) && 
                    (b.Location.LocationName.ToLower().Equals(model.LocationName.ToLower()) || string.IsNullOrEmpty(model.LocationName)) 
                   ); 
      //initializing of view for each item in result 
      foreach (var item in results) 
      { 
       var batchVM = new BulbBatchViewModel 
       { 
        BulbsAmount = item.BulbsAmount, 
        BulbTypeName = item.Delivery.BulbType.BulbName, 
        LocationName = item.Location.LocationName, 
       }; 
       batchesListVM.Add(batchVM); 
      } 
      var pageIndex = model.Page ?? 1; 
      model.SearchResult = batchesListVM.ToPagedList(pageIndex, RecordsPerPage); 
     } 
     else 
     { 
      //get all records from database without filtering filters 
      results = db.BulbBatches.Include(d => d.Delivery).Include(t => t.Delivery.BulbType); 
      foreach (var item in results) 
      { 
       var batchVM = new BulbBatchViewModel 
       { 
        BulbsAmount = item.BulbsAmount, 
        BulbTypeName = item.Delivery.BulbType.BulbName, 
        LocationName = item.Location.LocationName, 
       }; 
       batchesListVM.Add(batchVM); 
      } 
      var pageIndex = model.Page ?? 1; 
      model.SearchResult = batchesListVM.ToPagedList(pageIndex, RecordsPerPage); 
     } 
     if (!string.IsNullOrEmpty(model.ClearButton)) 
     { 
      model.BarCode = ""; 
      model.BulbName = ""; 
      model.LocationName = ""; 
      ModelState.Clear(); 
     } 
     return View(model); 
    } 

내가 인덱스 페이지 처음으로 가고있을 때 (/ 필터링 어떤 종류없이 검색) 내가 가지고에 요청의 양을 감소하기 위해 문을 포함하여 열망로드를 구현하려 오류이 내 다른 문장의 일부

results = db.BulbBatches.Include(d => d.Delivery).Include(t => t.Delivery.BulbType); 
       foreach (var item in results) 
       { 
        var batchVM = new BulbBatchViewModel 

을 ... "대기 작동이 시간 초과되었습니다"

W 암탉 내가 완벽하게 작동하는 데이터베이스에서 10 행을로드하려고했지만 내가 그것을 넣어 1000 중지합니다.

이 문제를 해결하는 데 도움을주십시오.

+0

가벼운 속성과 모델 만 있습니다. 어쩌면 데이터베이스 연결이 느린 것일까 요? – Marius

+0

@ Marus, nope.사실 내가 문제가 필드에 의해 발생했다는 것을 알았던 것처럼 public byte [] BulbBatchBarCodeImage {get; 세트; } 내 모델 안에. 그래서 내가 한 일은 선택 코드를 조금 바꿨고 더 이상 BarCodeImage 필드를로드하지 않게되었습니다. –

답변

0

문제가 해결되었습니다. 내가 알 수있는 바와 같이 문제는 내 모델 내부의 필드

public byte[] BulbBatchBarCodeImage { get; set; } 

에 의해 발생했다. 그래서 내가 한 일은 선택 코드를 조금 바꿨고 더 이상 BarCodeImage 필드를로드하지 않게되었습니다. 나는 액션 조금

  db.Configuration.ProxyCreationEnabled = false; 
     List<BulbBatchViewModel> results = new List<BulbBatchViewModel>(); 
     string barcode = ""; 
     if (!string.IsNullOrEmpty(model.BarCode)) 
      barcode = '*' + model.BarCode + '*'; 
     results = db.BulbBatches.Include(d => d.Delivery).Include(t => t.Delivery.BulbType).Include(l => l.Location) 
           .Where(b => 
            (b.BulbBatchBarCode.Equals(model.BarCode) || string.IsNullOrEmpty(model.BarCode)) && 
            (b.Delivery.BulbType.BulbName.ToLower().Equals(model.BulbName.ToLower()) || string.IsNullOrEmpty((model.BulbName))) && 
            (b.Location.LocationName.ToLower().Equals(model.LocationName.ToLower()) || string.IsNullOrEmpty(model.LocationName)) 
           ) 
           .Select(x => new BulbBatchViewModel 
           { 
            BulbBatchID = x.BulbBatchID, 
            BulbsAmount = x.BulbsAmount, 
            BulbTypeName = x.Delivery.BulbType.BulbName, 
            LocationName = x.Location.LocationName 
           }) 
           .ToList(); 
     model.SearchResult = results.OrderBy(r => r.BulbBatchID).Skip((model.Page - 1) * model.PageSize).Take(model.PageSize).ToList(); 
     model.TotalRecords = db.BulbBatches.Count(b => 
            (b.BulbBatchBarCode.Equals(model.BarCode) || string.IsNullOrEmpty(model.BarCode)) && 
            (b.Delivery.BulbType.BulbName.ToLower().Equals(model.BulbName.ToLower()) || string.IsNullOrEmpty((model.BulbName))) && 
            (b.Location.LocationName.ToLower().Equals(model.LocationName.ToLower()) || string.IsNullOrEmpty(model.LocationName)) 
           ); 
     return View(model); 

그리고 내 BulbBatchListViewModel 내부에 난 더 이상 사용하지 않는

PagedList하지만 간단한 목록을 다시 외에. .Take() 및 .Skip 메서드를 사용하여 테이블을 탐색합니다.

같은 어려움을 겪을 사람을 위해. 는

 public ActionResult Index(BulbBatchListViewModel model) 
    { 
     db.Configuration.ProxyCreationEnabled = false; 
     List<BulbBatchViewModel> results = new List<BulbBatchViewModel>(); 
     string barcode = ""; 
     if (!string.IsNullOrEmpty(model.BarCode)) 
      barcode = '*' + model.BarCode + '*'; 
     results = db.BulbBatches.Include(d => d.Delivery).Include(t => t.Delivery.BulbType).Include(l => l.Location) 
           .Where(b => 
            (b.BulbBatchBarCode.Equals(model.BarCode) || string.IsNullOrEmpty(model.BarCode)) && 
            (b.Delivery.BulbType.BulbName.ToLower().Equals(model.BulbName.ToLower()) || string.IsNullOrEmpty((model.BulbName))) && 
            (b.Location.LocationName.ToLower().Equals(model.LocationName.ToLower()) || string.IsNullOrEmpty(model.LocationName)) 
           ) 
           .Select(x => new BulbBatchViewModel 
           { 
            BulbBatchID = x.BulbBatchID, 
            BulbsAmount = x.BulbsAmount, 
            BulbTypeName = x.Delivery.BulbType.BulbName, 
            LocationName = x.Location.LocationName 
           }) 
           .ToList(); 
     model.SearchResult = results.OrderBy(r => r.BulbBatchID).Skip((model.Page - 1) * model.PageSize).Take(model.PageSize).ToList(); 
     model.TotalRecords = db.BulbBatches.Count(b => 
            (b.BulbBatchBarCode.Equals(model.BarCode) || string.IsNullOrEmpty(model.BarCode)) && 
            (b.Delivery.BulbType.BulbName.ToLower().Equals(model.BulbName.ToLower()) || string.IsNullOrEmpty((model.BulbName))) && 
            (b.Location.LocationName.ToLower().Equals(model.LocationName.ToLower()) || string.IsNullOrEmpty(model.LocationName)) 
           ); 
     return View(model); 
    } 

감사합니다 여러분 모두의 ViewModel

public class BulbBatchListViewModel 
{ 
    public int Page { get; set; } 
    public int PageSize { get; set; } 
    public int TotalRecords { get; set; } 
    ///<summary> 
    /// order field 
    /// </summary> 
    public string Sort { get; set; } 
    public string SortDir { get; set; } 
    /// <summary> 
    /// fields for searching 
    /// </summary> 
    public string BulbName { get; set; } 
    public string BarCode { get; set; } 
    public string LocationName { get; set; } 
    /// <summary> 
    /// we are using IPageList instead of IEnumerable to create pagination on the view 
    /// </summary> 
    //public IPagedList<BulbBatchViewModel> SearchResult { get; set; } 
    public List<BulbBatchViewModel> SearchResult { get; set; } 
    public string SearchButton { get; set; } 
    public string ClearButton { get; set; } 

    public BulbBatchListViewModel() 
    { 
     Page = 1; 
     PageSize = 5; 
     Sort = "BulbBatchID"; 
     SortDir = "ASC"; 
    } 
} 

컨트롤러를 업데이트했습니다.