2012-05-22 2 views
4

큰 테이블에서 데이터를 쿼리하기 위해 linq를 사용하여 nhibernate를 사용하고 있습니다. 내 데이터 쿼리를 제한하고 단지 마지막 1000 행을 얻으려면 노력하고 다음 필터링, 정렬 및 pagin.
데이터 쿼리를 제한하고 마지막 행만 가져옵니다.

나는 오류를 가지고) .Take를 (사용하려고하면 :

unable to locate HQL query plan in cache; generating (.Count[X4Data.Entity.IEventView](.OrderBy[X4Data.Entity.IEventView,System.DateTime](.Take[X4Data.Entity.IEventView](.Where[X4Data.Entity.IEventView](NHibernate.Linq.NhQueryable`1[X4Data.Entity.IEventView], Quote((x,) => (Equal(x.DeviceId, p1))),), p2,), Quote((c5d4d87c-87ba-4e91-9652-bcdc87e3f0ba,) => (c5d4d87c-87ba-4e91-9652-bcdc87e3f0ba.AtmTime)),),)) 

내 코드 :

query = query.Take(rowCount); 
query = query.ApplyFiltering(cmd, binder); 
query = query.ApplySorting(cmd, binder); 
binder.TotalCount = query.Count(); 
query = query.ApplyPaging(cmd); 

덕분에 나의 나쁜 영어

+0

http://codereview.stackexchange.com/questions/9773/optimizing-liststring-performance-in- c/9777 # 9777 –

답변

5

시도 :

query.OrderByDescending(criteria).Take(rowCount).OrderBy(criteria) 
+1

ID 나 날짜 같은 기준이있는 경우에만 작동합니다. – HW90

2

에 대한 많은 미안 다음을 사용할 수 있습니다 :

list.Skip(Math.Max(0, list.Count() - N)).Take(N); 
,515,

예 : 여기

리스트가 9999의 값을 포함하고 LINQ 통해 지난 1000 개 값을 선택하는 생성된다.

List<int> list = new List<int>(); 
     for (int i = 0; i < 9999; i++) 
     { 
      list.Add(i); 
     } 
     int take = 1000; 
     var result = list.Skip(Math.Max(0, list.Count() - take)).Take(take); 
1

ICriteria 를 사용하여이 시도 :

criteria.SetMaxResults(1000); 
    criteria.AddOrder(Order.Desc("ID")); 
관련 문제