2012-05-22 26 views
4

我正在使用linq to nhibernate從大型表中查詢數據。我試圖限制我的數據查詢,只獲得最後1000行,然後才進行篩選,排序和分頁。
限制數據查詢並只獲取最後1000行

當我嘗試使用。取()我得到了一個錯誤:

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

嘗試:使用的ICriteria

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

如果您有像身份證或日期這樣的標準,這種方法可行。 – HW90

2

你可以用這個:

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

實施例:創建

這裏一個列表,其中包含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

試試這個:

criteria.SetMaxResults(1000); 
    criteria.AddOrder(Order.Desc("ID"));