2014-04-23 5 views
1

asp.net MVC 5를 사용하여 응용 프로그램을 구축 중이며 IPagedList.MVC 버전 4.5.0.0, AutoMapper 및 Entity Framework로 작업하는 표가 있습니다. 프로젝트에서 IPagedList.MVC, 총 크기를 설정 하시겠습니까?

나는 나의 행동 회담, 나는 동작 방법은 직접 엔티티 프레임 워크에 얘기하고 싶지 않아로서 무엇인가 BusinessLayer 있습니다. 그래서 내 BLL는 다음과 같은 방법이 있습니다

 public IPagedList<ActiveContractViewModel> GetAllContracts(string regNumFilter, int page) 
    { 
     var lstcontractViewModel = new List<ActiveContractViewModel>(); 
     using (ActiveContractRepository activeContractRepos = new ActiveContractRepository(new UnitOfWork())) 
     { 
      var activeContractList = activeContractRepos.All.OrderByDescending(x => x.Id).Include(c => c.Contractor); 

      if (regNumFilter.Trim().Length > 0) 
      { 
       activeContractList = activeContractRepos.All.Where(x => x.RegistrationNumber.Contains(regNumFilter)).OrderByDescending(x => x.Id).Include(c => c.Contractor); 
      } 

      foreach (var activeContract in activeContractList) 
      { 
       Mapper.CreateMap<DomainClasses.ActiveContract, ActiveContractViewModel>().ForMember(dest => dest.ContractorModel, opts => opts.MapFrom(src => new ContractorViewModel 
        { 
         Id = src.Contractor.Id, 
         Name = src.Contractor.Name, 
         ContactPerson = src.Contractor.ContactPerson, 
         Phone = src.Contractor.Phone, 
         Fax = src.Contractor.Fax, 
         Address = src.Contractor.Address, 
         VendorNumber = src.Contractor.VendorNumber, 
         FederalTaxId = src.Contractor.FederalTaxId 
        } 
       )); 

       Mapper.AssertConfigurationIsValid(); 
       lstcontractViewModel.Add(Mapper.Map<ActiveContractViewModel>(activeContract)); 
      } 
     } 

     return lstcontractViewModel.ToPagedList(page, 20); 
    } 

내가 (엔티티 프레임 워크에서) 내 ActiveContract 클래스를 매핑하고있어 모델 (ActiveContractVieWModel)가 잘 작동에를, 데이터가 반환 및 페이징 작품입니다. 하지만 foreach 루프가 모든 레코드를 거쳐야한다는 것을 디버깅하는 동안 알아 냈습니다. 2500 레코드가 있으면 큰 목록을 작성하고 ToPageList 메서드에서 사용합니다.

이 주위에 얻을 수있는 더 좋은 방법이 있나요, 그래서 난 내 모델을 구축하고 내가 원하는 단지 20 개 레코드를 작성하여 IPagedList이 전체 크기를 알 수 있습니까?

+0

첫째, 나는 그 CreateMap을 for 루프에서 꺼낼 것이고, 프로그램 시작시 한 번만 수행하면된다. (http://stackoverflow.com/questions/6825244/where-to-place-automapper-createmaps. – Jasen

답변

2

는 좀 더 IPageList.MVC으로보고 끝내었고, 저자는 이것에 대해 게시했다 보았다 는 https://github.com/troygoode/pagedlist#example-2-manual-paging

"경우에 따라 액세스 할 수 없습니다 .Net의 기본 제공 MembershipProvider의 GetAllUsers 메서드를 사용할 때와 같이 IQueryable을 만들 수있는 무언가.이 방법은 페이징을 제공하지만 IQueryable을 통한 것은 아닙니다. 다행히 PagedList 여전히 다시 (StaticPagedList의 사용에주의)이 있습니다. "

내가 StaticPagedList를 사용하여 전환을하고 그냥 내가 원하는 페이징뿐만 아니라 작동 레코드 수를 잡아 더 나은 지금 작동

0

나는 automapper하지만 valueinjecter를 사용하지 않는거야. 내가 뭘

는 당신이 늘 코드를 IList<TModel>IList<TViewModel>에 "매핑"입니다. 더 깨끗할 것입니다.

PagedList는 그냥 페이징을 수행, TEntity을 인식하지 못합니다. 페이징이 게으른 걸 잊지 마라. Valueinjecter

나는 다음과 같은 코드를 가지고 :

https://github.com/fatagun/NetCollab/blob/master/NetCollab.Web/Mappers/Mapper.cs

0

난 당신이 AutoMapper Queryable-Extensions입니다 필요 생각합니다. 당신이 IEnumerable<T> 인터페이스를 사용하여 지금까지 밑줄 엔티티 쿼리가 구체화되고

. 그래서 ToPagedList가 일부 페이지를 "가져오고"건너 뜁니다 전에 전체 테이블에 대해 쿼리가 실행됩니다. 대신 IQueryable<T> 유사 콘텐츠를 사용해야합니다. 같은 AutoMapper의 표준 Mapper.Map의 기능 NHibernate에 또는 엔티티 프레임 워크와 같은 ORM을 사용하는 경우

, 당신은 ORM이 AutoMapper 결과를 매핑 할 시도 그래프에서 모든 개체의 모든 필드를 쿼리합니다 것을 알 수 있습니다 대상 유형으로

1

모든 항목을 검색 중이므로 그 대상을 입력하십시오. 당신의 LINQ 쿼리에, 당신은 당신이 결과를 반복하기 전에 (당신은 페이지 당 20 개 항목의 경우), Skip()Take()을 사용하여 특정 수의 행을 검색하려면 regNumFilter

var activeContractList = activeContractRepos 
    .All 
    .OrderByDescending(x => x.Id) 
    .Include(c => c.Contractor); 

activeContractList = activeContractRepos 
    .All 
    .Where(x => x.RegistrationNumber.Contains(regNumFilter)) 
    .OrderByDescending(x => x.Id) 
    .Include(c => c.Contractor); 

에 의해 필터링된다.

샘플 코드 :

var activeContractList = activeContractList 
    .Skip(20 * page) 
    .Take(20); 

foreach (var activeContract in activeContractList) 
{ 
    .... 
} 
+0

) 반환 20 결과 확실하지만 페이지 번호 = 1 표시됩니다. OP 20 페이지 결과를 검색 할 때 PagedList에 총 레코드 수를 설정하는 방법을 요청하는 페이지 수 사용자에게 데이터베이스의 총 레코드 수를 반영합니다.이 질문에 대한 대답은 아니며, j 그것을 확장해야합니다! –

관련 문제